jsonはnullのいくつかの方法を取り除きます

4878 ワード

iOSの開発では、サーバとのデータ通信が頻繁に必要になります.Jsonは、一般的に使用される効率的で簡潔なデータフォーマットです.
もんだいげんしょう
しかし、いくつかのプロジェクトでは、いくつかのデータを取得した後、プログラムがクラッシュしているという問題に直面しています.サーバのデータベースに空のフィールドがあるため、Json形式でクライアントに返すと、このようなデータが表示されます.
"somevalue":null

JsonKitというサードパーティライブラリで解析したデータが
somevalue = "<null>";

このデータ型はnilでもStringでもありません.オブジェクトに解析した後、このオブジェクトに直接メッセージ(eg:length,countなど)を送信すると、直接クラッシュします.エラー:
-[NSNull length]: unrecognized selector sent to instance 0x388a4a70

解決策
実はずっと完璧な解決方法を見つけていないので、長い間穴をあけていました.
1、最初の解決方法は、現在遭遇しているクラッシュに対処するために、どのフィールドが空である可能性があるかを見て、そのフィールドの使用前に判断を行い、クラッシュ時のエラーメッセージから、このようなフィールドがNSNullタイプのオブジェクトとして解析されていることがわかるので、このタイプかどうかを直接判断することができます.
if (![isKindOfClass:[NSNull class]]){xxxxxxx;} 

フィールドが多すぎるので、補完を探します.
2、この問題を徹底的に解決しようと、データソースから手を出そうとしたが、実はこのnullを正規表現でマッチングして置き換えることができるはずだ.文字列マッチングというパクリの方法が出てきましたサーバから返されたJsonを取得すると、結果が返されるとstringオブジェクトが返され、nullを空の文字に置き換えます」と解析します.
json = [jsonStr  stringByReplacingOccurrencesOfString:@":null" withString:@":\"\""];

この方法はもともと効果的だったが、私のところのサーバーは極めて簡潔ではなく、各種のゴミデータを返している(これにツッコミはしない).どうせjsonは解析できない.
3、最后に仕方がなくて、解析の时に手をつけるしかなくて、NSNullタイプの値をnilに交换します.一般的にtoolメソッドを書き、解析時に呼び出します.しかし、面倒なのでマクロを書こうとしたが、驚くべき検索でマクロに戻り値があることが分かった.結果は以下のようになった.
#define VerifyValue(value)\ ({id tmp;\ if ([value isKindOfClass:[NSNull class]])\ tmp = nil;\ else\ tmp = value;\ tmp;\ })\

マクロの最後の文は戻り値です.次に、データの解析時にマクロを呼び出します.
contact.contactPhone = VerifyValue(contactDic[@"send_ContactPhone"]);

4、もしあなたがAFNetworkというライブラリを使ってネットの要求をするならば、以下のコードを使って、自動的にこの嫌な空の値を取り除くことができます
self.removesKeysWithNullValues = YES;

5、究極の方案はついに一労永逸の方案を見つけて、牛が追い詰めた外国人はCategoryを書いて、Null Safeと呼ばれて、運行時に操作して、この嫌な空の値をnilに置いて、nilは安全で、nilオブジェクトにどんなmessageを送っても潰さないことができます.このcategoryはとても便利で、工事に参加すればいいです.他のことは何もしなくてもいいです.はい、簡単です.詳しくはGithubでご覧ください.https://github.com/nicklockwood/NullSafe