6

が有効な JSONNSJSONSerializationであることを確認する方法はありますか? NSData何らかの理由で API が無効な JSON を返した場合に、アプリケーションでエラーが発生することは望ましくありません。

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
4

3 に答える 3

30

これは「エラーアウト」しません。JSONが有効でない場合はnilを返します。したがって、それが有効なJSONであるかどうかを確認するためのテストは次のようになります。

NSError *error;
if ([NSJSONSerialization JSONObjectWithData:data
                                    options:kNilOptions
                                      error:&error] == nil)
{
    // Handle error
}

それが戻った場合は、何が悪かったのかをnil確認できます。error

于 2012-03-29T22:13:14.507 に答える
7

NSJSONSerializationクラスにはこれを正確に行うメソッドがあります...(編集:いいえ、そうではありません...)

NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
id jsonObj = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
BOOL isValid = [NSJSONSerialization isValidJSONObject:jsonObj];

編集:(ハイパークリプトのコメントの後)

Hypercrypt は正しいです (なぜそれを見逃したのか、本当に理解できません)...私の答えは機能しているように見えますが、間違っています。どのisValidJSONObject:メソッドが行うかは、オブジェクトを JSON にシリアル化できるかどうかを確認することであり、その逆はできません。だから彼の答えはあなたが探しているものです. このメソッドは、json ペイロードから変更可能なコピーを取得して変更し、後で再シリアル化して JSON 文字列に戻しても安全かどうかを確認する場合に使用できます。しかし、肝心なのは、ハイパークリプトの答えは正しいものであり、私の代わりに彼の答えを正しいとマークするのは公平以上だと思います. とにかく、混乱について申し訳ありません.@hypercryptはそれを指摘してくれてありがとう:)

于 2012-03-30T10:41:39.753 に答える
0

NSJSONSerialization でオブジェクトを作成せずにデータをチェックする方法は実際にはありません。私はそれをtry-catchに入れます。catch ブロックで終わる場合、それは有効な JSON ではありません。

EDIT: Come to think of it, if it encountered an error, 'error' is an error object. So even if nothing is thrown you can check that to see if the data was valid.

于 2012-03-29T22:07:57.823 に答える