0

PHPスクリプトを使用してJSONを作成しました。JSON を読み取っていますが、データが正しく読み取られていることがわかります。ただし、オブジェクトにアクセスすると、認識できないセレクターがインスタンスに送信されます...

それが何時間も経った後である理由を見つけることができないようです。どんな助けでも素晴らしいでしょう!

私のコードは次のようになります。

NSDictionary *json = [[NSDictionary alloc] init];
json = [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&error];

NSLog(@"raw json = %@,%@",json,error);  

NSMutableArray *name = [[NSMutableArray alloc] init];

[name addObjectsFromArray: [json objectForKey:@"name"]];

上記の最後の行に到達すると、コードがクラッシュします。

このような出力:

raw json = (
        {
        category = vacancies;
        link = "http://blablabla.com";
        name = "name 111111";
        tagline = "tagline 111111";
    },
        {
        category = vacancies;
        link = "http://blobloblo.com";
        name = "name 222222222";
        tagline = "tagline 222222222";
    }
),(null)
2012-06-23 21:46:57.539 Wind expert[4302:15203] -[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0xdcfb970

ヘルプ !!!

4

2 に答える 2

2

json辞書ではなく、あなたが示したものからの配列です。のログ出力全体が括弧で囲まれているため、これがわかりますjson。配列の中には辞書があり、中かっこで囲まれていることからわかります。

したがって、次のようなものが必要なようです。

NSError *error = nil;
NSArray *json = [NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&error];

NSLog(@"raw json = %@,%@",json,error);  

NSMutableArray *name = [[NSMutableArray alloc] init];
for (NSDictionary *obj in json) {
    [name addObject:[obj objectForKey:@"name"]];
}

余談ですがjson、オブジェクトの不必要な初期化を削除してから、次の行でJSONObjectWithData:options:error:. ARC の世界では、それはリークにはなりませんが、オブジェクトを割り当ててすぐにそれを再び取り除くことはまったく不要です。NSError *error = nil;また、それが存在せず、明らかにコンパイルする必要があったため、行に追加しました。

于 2012-06-23T21:13:53.483 に答える
1

問題は、JSON のルート レベルが辞書ではなく配列であることです (ログに記録された出力の最初の文字として中括弧ではなく括弧に注意してください)。objectForKey配列にはセレクターがありません。おそらく最初に objectAtIndex:0 を取得するつもりですか、それともすべてのアイテムを反復処理するつもりですか?

余談ですが、コードの最初の行では、NSDictionary の完全に無駄な初期化が行われています。これは単純に上書きされ、次の行で割り当てが解除されます。

于 2012-06-23T21:12:14.217 に答える