6

次のように見える RESTful Web API によって返された JSON 配列を解析しようとしています (jsonviewer を使用すると、json は配列内の一連の辞書として返されます)。

[{
"date": "2011-03-21",
"meal": "BREAKFAST",
"category": "BREAKFAST BAKERY",
"recipe": "213012",
"name": "Aesops Bagels",
"portion": "1",
"unit": "each"},

「名前」情報を取得して、テーブルビューに保存しようとしています。これを達成するために私が使用しているコードは次のとおりです。

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSArray *allDataArray = [NSJSONSerialization JSONObjectWithData:webData 
                                                            options:0 
                                                              error:nil];

    for (NSDictionary *diction in allDataArray) {
        NSDictionary *menuItem = [diction objectForKey:@"menuItem"];
        NSString *name = [menuItem objectForKey:@"name"];

        [array addObject:name];
    }

    [[self MyTableView]reloadData];
}

私が得ているエラーは次のとおりです。

キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '*** -[__NSArrayM insertObject:atIndex:]: オブジェクトを nil にすることはできません'

したがって、for ループの上の行でエラーが発生していると確信しています。これにより、配列がnil値として取得しようとしています。しかし、何がうまくいかないのか、このjsonを正常に解析する方法を理解する助けがあれば、非常に高く評価されます. 私はjson、xcode、およびiOSの両方に非常に慣れていないため、特に愚かなことをした場合はお詫び申し上げます。

4

2 に答える 2

1

ckhanが言ったように、JSONオブジェクトは単なる辞書の配列であり、「menuitem」への参照はありません。実際、JSONオブジェクトに「menuitem」エントリがない場合(つまり、質問で提供されたJSONが代表的であると仮定した場合)、次のようになります。

for (NSDictionary *diction in allDataArray)
    [array addObject:[diction objectForKey:@"name"]];

または

[allDataArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [array addObject:obj[@"name"]];
}];

または、もっと簡単に言えば、aではなくarray不変にし、次を使用します。NSArrayNSMutableArray

NSArray *array = [allDataArray valueForKey:@"name"];

ちなみに、一部の辞書エントリに「名前」エントリがない可能性があることを本当に懸念している場合、1行valueForKeyでそれを処理し、他の行では条件付きロジックを追加する必要があります。例:

for (NSDictionary *diction in allDataArray) {
    id value = diction[@"name"];
    if (value == nil)
        value = [NSNull null];
    [array addObject:value];
};

NSNull明らかに、名前のない辞書エントリがあったことがわかるように、配列にaを追加しています。このシナリオをどのように処理するか(たとえば、NSNullを追加する、単に何も追加しないなど)はあなた次第ですが、うまくいけば、これでアイデアが得られます。しかし、主な問題は「menuitem」の参照だったと思うので、これは議論の余地があるかもしれません。

于 2012-12-01T15:21:41.173 に答える
1

menuItem実際には、JSON サンプルで呼び出される項目はありません。あなたのコードは、次のような JSON を解析するために書かれたように見えます。

[{ "menuItem" : { "name" : "Aesops Bagels",
                  …
                }
 },
]

つまり、リスト内の各辞書に「menuItem」キーが必要です。投稿したスニペットを実際に解析しようとしている場合は、次のループ コードを単純化するだけでよいと思います。

NSDictionary *menuItem = [diction objectForKey:@"menuItem"];
NSString *name = [menuItem objectForKey:@"name"];

に:

NSString *name = [diction objectForKey:@"name"];

データに名前のないエントリがある場合に備えて、結果配列に追加する前に name が nil でないことを確認することもできます。

于 2012-12-01T08:12:02.207 に答える