Jsonのnullの問題とマクロの戻り値について

2592 ワード

変換元:http://www.pan-apps.com/668.html
iOSの開発では、サーバとのデータ通信が頻繁に必要になります.Jsonは、一般的に使用される効率的で簡潔なデータフォーマットです.
もんだいげんしょう
しかし、いくつかのプロジェクトでは、いくつかのデータを取得した後、プログラムがクラッシュしているという問題に直面しています.サーバのデータベースに空のフィールドがあるため、Json形式でクライアントに返すと、このようなデータが表示されます."somevalue" :null
JsonKitというサードパーティライブラリで解析したデータがsomevalue =  "" ;
このデータ型は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
共有先:
QQ空間
新浪微博
テンセント
微信の詳細
0