1

NSDictionary返されたJSONを介して外部サイトからデータを入力しようとしているのは簡単です。返される JSON は問題ありませんが、特定のキーの実際のデータを取得するのに問題があります。

以下は、コンソールに出力された JSON データです。

これは私のJSONデータです:

(
        {
        CategoryID = 12345;
        CategoryName = "Baked Goods";
    },
        {
        CategoryID = 12346;
        CategoryName = Beverages;
    },
        {
        CategoryID = 12347;
        CategoryName = "Dried Goods";
    },
        {
        CategoryID = 12348;
        CategoryName = "Frozen Fruit & Vegetables";
    },
        {
        CategoryID = 12349;
        CategoryName = Fruit;
    },
        {
        CategoryID = 12340;
        CategoryName = "Purees & Soups";
    },
        {
        CategoryID = 12341;
        CategoryName = Salad;
    },
        {
        CategoryID = 12342;
        CategoryName = "Snack Items";
    },
        {
        CategoryID = 12343;
        CategoryName = Vegetables;
    }
)

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

キャッチされない例外 'NSInvalidArgumentException' によるアプリの終了、理由: '-[__NSCFArray enumerateKeysAndObjectsUsingBlock:]: 認識されないセレクターがインスタンス 0x6884000 に送信されました'

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

    NSError *error = nil;
    // Get the JSON data from the website
    NSDictionary *categories = [NSJSONSerialization JSONObjectWithData:data  options:kNilOptions error:&error];

    if (categories.count > 0){
        NSLog(@"This is my JSON data %@", categories);

        [categories enumerateKeysAndObjectsUsingBlock: ^(__strong id key, __strong id obj, BOOL *stop) {
        NSLog(@"Key = %@, Object For Key = %@", key, obj); }];
}

なぜこれが起こっているのかはわかりませんが、間違ったオブジェクトを使用しているなどの単純なことだと確信しています。

助けていただければ幸いです。

4

1 に答える 1

4

+JSONObjectWithData:options:error:NSDictionary ではなく NSArray を返しています。'-[__NSCFArray enumerateKeysAndObjectsUsingBlock:]エラーメッセージの重要な部分です。-enumerateKeysAndObjectsUsingBlock:配列を呼び出していることがわかります。


この場合、-enumerateObjectsUsingBlock:代わりに使用できます。

NSArray または NSDictionary が返されるかどうかわからない場合は、次を使用できます。-isKindOf:

id result = [NSJSONSerialization …];
if ([result isKindOf:[NSArray class]]) {
    NSArray *categories = result;
    // Process the array
} else if ([result isKindOf:[NSDictionary class]]) {
    NSDictionary *categories = result;
    // Process the dictionary
}

enumerateObjectsUsingBlockから:

配列内の各オブジェクトを使用して、最初のオブジェクトから開始し、配列内の最後のオブジェクトまで、指定されたブロックを実行します。

  • (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))ブロック

だからそれはそのように呼ばれるべきです

[categories enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSLog(@"index = %d, Object For Key = %@", idx, obj);
}];

ドキュメントをざっと読むだけで、フラストレーションをかなり軽減できます。

于 2012-06-21T17:57:19.863 に答える