Jsonのnullの問題とマクロの戻り値について
2592 ワード
変換元:http://www.pan-apps.com/668.html
iOSの開発では、サーバとのデータ通信が頻繁に必要になります.Jsonは、一般的に使用される効率的で簡潔なデータフォーマットです.
もんだいげんしょう
しかし、いくつかのプロジェクトでは、いくつかのデータを取得した後、プログラムがクラッシュしているという問題に直面しています.サーバのデータベースに空のフィールドがあるため、Json形式でクライアントに返すと、このようなデータが表示されます.
JsonKitというサードパーティライブラリで解析したデータが
このデータ型はnilでもStringでもありません.オブジェクトに解析した後、このオブジェクトに直接メッセージ(eg:length,countなど)を送信すると、直接クラッシュします.エラー:
解決策
実はずっと完璧な解決方法を見つけていないので、長い間穴をあけていました.
1、最初の解決方法は、現在遭遇しているクラッシュに対処するために、どのフィールドが空である可能性があるかを見て、そのフィールドの使用前に判断を行い、クラッシュ時のエラーメッセージから、このようなフィールドがNSNullタイプのオブジェクトとして解析されていることがわかるので、このタイプかどうかを直接判断することができます.
フィールドが多すぎるので、補完を探します.
2、この問題を徹底的に解決しようと、データソースから手を出そうとしたが、実はこのnullを正規表現でマッチングして置き換えることができるはずだ.文字列マッチングというパクリの方法が出てきましたサーバから返されたJsonを取得すると、結果が返されるとstringオブジェクトが返され、nullを空の文字に置き換えます」と解析します.
この方法はもともと効果的だったが、私のところのサーバーは極めて簡潔ではなく、各種のゴミデータを返している(これにツッコミはしない).どうせjsonは解析できない.
3、最后に仕方がなくて、解析の时に手をつけるしかなくて、NSNullタイプの値をnilに交换します.一般的にtoolメソッドを書き、解析時に呼び出します.しかし、面倒なのでマクロを書こうとしたが、驚くべき検索でマクロに戻り値があることが分かった.結果は以下のようになった.
マクロの最後の文は戻り値です.次に、データの解析時にマクロを呼び出します.
4、もしあなたがAFNetworkというライブラリを使ってネットの要求をするならば、以下のコードを使って、自動的にこの嫌な空の値を取り除くことができます
5、究極の方案はついに一労永逸の方案を見つけて、牛が追い詰めた外国人はCategoryを書いて、Null Safeと呼ばれて、運行時に操作して、この嫌な空の値をnilに置いて、nilは安全で、nilオブジェクトにどんなmessageを送っても潰さないことができます.このcategoryはとても便利で、工事に参加すればいいです.他のことは何もしなくてもいいです.はい、簡単です.詳しくはGithubでご覧ください.https://github.com/nicklockwood/NullSafe
共有先:
QQ空間
新浪微博
テンセント
微信の詳細
0
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