2

これは私がこれまで持っているコードです

// Parse data using NSJSONSerialization
NSError *error = nil;
NSArray *JsonArray = [NSJSONSerialization JSONObjectWithData:myData options:NSJSONReadingMutableContainers error: &error];
if(!JsonArray)
{
    NSLog(@"Error Parsing Data: %@", error);
}
else
{
    for(NSDictionary *event in JsonArray)
    {
        if([[event description] isEqualToString:@"error"])
        {
            // Get error number? I am confused by this part
            NSLog(@"Element: %@", [event objectForKey:@"error"]);
        }
        else
        {
            NSLog(@"Element: %@", [event description]);
        }
    }
}

これは、正しく解析される JSON データです。

[{data string}, {data strings}]

これは文字列「エラー」のみを提供し、intも提供しません:

{"error":0}

役立つ場合は、PHP スクリプトからこのデータをエコーし​​ています。私はそれを間違っているだけですか、それとも何かを見逃しましたか?

4

3 に答える 3

4

あなたの問題は、エラーを受け取ったときに ではNSDictionaryなくが返されることですNSArray。これはうまくいくはずです:

if ([jsonObject isKindOfClass:[NSArray class]]) {
    // no error: enumerate objects as you described above
} else if ([jsonObject isKindOfClass:[NSDictionary class]]) {
    // error: obtain error code
    NSNumber *errCode = jsonObject[@"error"];
} else {
    // something bad's happening
}

文体に関するアドバイス:

  1. JsonArrayオブジェクトは常に配列ではないため、呼び出さないでください。それを呼び出しますjsonObject

  2. 変数名を大文字で始めないでください。

于 2013-11-09T19:26:48.890 に答える
0

解析しようとしている完全な JSON ドキュメントを投稿した場合は素晴らしいことです。それがなければ、コードがほぼ正しいかどうかを判断する機会がまったくないからです。あなたが与えた例 [{data string}, {data strings}] は間違いなく正しい JSON ドキュメントではないため、解析しようとすると nil が返されます。{"error":0} は、単一のキー "error" と値 0 を持つ辞書です。単一のキーを持つ辞書を持つことは珍しいとしましょう。

JSON ドキュメントには、NSArray* または NSDictionary* に変換される配列またはオブジェクト (JSON 用語を使用) が含まれています。配列またはディクショナリのどちらを期待するかを知っておく必要があります。NSArray が必要な場合は、[jsonObject isKindOfClass:[NSArray クラス]] を確認してください。NSDictionary が必要な場合は、[jsonObject isKindOfClass:[NSDictionary クラス]] を確認してください。そうしないと、間違った JSON ドキュメントによってアプリがクラッシュするか、まったく意味のないものになります。

配列がある場合、通常は配列の要素を繰り返し処理し、それぞれを順番に処理します。辞書がある場合は、通常、処理方法を知っているキーを検索します。あなたがしていること、辞書の配列を反復処理し、「エラー」のキーを持つ辞書をチェックすることは、JSON ドキュメントの非常に奇妙な設計です。

そして、「説明」メソッドが何をするかを調べます。「説明」は、オブジェクトを印刷するように求められたときに、何を印刷するかを調べるために NSLog が呼び出すものです。単一のキー "error" と値 0 を持つ NSDictionary の場合、"error:0" のようなものが返されますが、これはもちろん "error" とは異なります。

于 2014-02-13T00:22:17.460 に答える
0
NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:myData options:NSJSONReadingMutableContainers error:&error];
NSLog(@"jsonDic: %@", [jsonDic objectForKey:@"string"]);
于 2013-11-09T19:19:22.830 に答える