Objective-C用のシンプルなJSONスキーマバリデーター

または、JSONバリデーターの開発がどのように別のJSONバインディングに変わったかについての物語


通常の開発者はアプリケーションを作成しますが、私は自転車を発明します。

おそらく、多くの開発者が、モバイルアプリケーションがバックエンドと並行して開発されている状況に遭遇しています。 同時に、多くの場合、サーバーからのリクエストに応じて送信されるデータ構造が変更される場合があります。 たとえば、バックエンド側では、JSONキーの1つの名前を変更することを決定し、これについてモバイルチームに警告することを忘れています。 キャメルケースが表記をアンダースコアに、またはその逆に「突然」変更することを決定した状況については話していません。 プロセスの組織が貧弱で、チーム間のコミュニケーションが不足していると言うことができます。あなたは絶対に正しいでしょう。 しかし、顧客のスマートフォン上のアプリケーションがデモで動作しなくなると、すべての目が携帯電話に向けられます。


ソリューションの1つは、 JSONスキームJSONスキーム概要記事 )に従って送信されたJSONの検証です。

たとえば、JSONが送信された場合
{ "numberKey" : 100500, "arrayKey" : [ { "number" : 1 , "string" : "1" }, { "number" : 2 , "string" : "2" }, { "number" : 3 , "string" : "3" } ] } 

それを記述する最小のJSONスキーマは
 { "type" : "object", "properties" : { "numberKey" : { "type" : "number" }, "arrayKey" : { "type" : "array", "items" : { "type" : "object", "properties" : { "number" : { "type" : "number" }, "string" : { "type" : "string" } } } } } } 

理想的に必要なのは、送信されたJSONを取得し、回路を使用して検証することです。 問題は解決されたようです。 JSONスキーマはJSONを記述する標準的な方法であり、多くのプログラミング言語のバリデーターがあります。 しかし、Objective-C言語のバリデーターを検索しても、正しい結果は得られなかったため、自転車の建設の道を進むことが決定されました。

その結果、 JsonSchemaValidator (bitbucket)と呼ばれる作品が誕生しました。 試してみたい人のために:
 pod 'SVJsonSchemaValidator' 

したがって、このライブラリの助けを借りて、ダイアグラムを作成できます。
idスキーマ= [ [ SVTypeオブジェクト]プロパティ @ {
@ "numberKey" [ SVType番号]
@ "arrayKey" [ [ SVType配列]アイテム [ [ SVTypeオブジェクト]プロパティ @ {
@ "number" [ SVType番号]
@ "string" [ SVType string ]
} ] ]
} ] ;

ご覧のとおり、ほぼ1対1のスキームはJSON自体を繰り返します。 今それを検証します:
NSError * error = nil ;
id validatedJson = [スキーマvalidateJson jsonエラー:&エラー] ;
変数は次のとおりです。
jsonは、パーサーによって解析されたJSONです(たとえば、NSJSONSerializationを使用)。
validatedJson-検証に合格したオブジェクトのみ。
エラー-検証に失敗したオブジェクトの多かれ少なかれ正気な説明。 nil-すべてが問題ない場合。

モデルクラスが既にあるとします
@ interface MyModelObject NSObject

@property strong、nonatomic NSString * string ;
@property strong、nonatomic NSNumber *数値;

@ 終わり

二重の仕事をして、図で既存のクラスを説明したくありません。 このクラスからスキーマを直接作成できます。
idスキーマ= [ [ SVTypeオブジェクト]プロパティ @ {
@ "numberKey" [ SVType番号]
@ "arrayKey" [ [ SVType array ] items [ MyModelObject jsonSchema ] ]
} ] ;

objc-runtimeを使用すると、MyModelObjectクラスの-jsonSchemaメソッドは、JSONで表現できるすべてのプロパティを通過し、まったく同じスキームを生成します。 同じスキームを使用して、タイプMyModelObjectのオブジェクトをインスタンス化し、KVCを介してプロパティに適切な値を入力できます。
NSDictionary * instanciated = [ schema instantiateValidatedJson validated ] ;

lldb poインスタンス化
$ 1 = 0x0755fe70 {
numberKey = 100500
arrayKey =
「<MyModelObject:0x7554a30>」
"<MyModelObject:0x7554610>"
「<MyModelObject:0x75543b0>」
「<MyModelObject:0x75619b0>」
;
}

現時点で実装されているのはそれだけです。
そして今、この短いトピックが書かれた目的のために、この自転車が必要ですか?もしそうなら、他に何が必要ですか? kamentyで答えを待っています。

Source: https://habr.com/ru/post/J180923/


All Articles