Поймите и используйте эти данные JSON в iOS - PullRequest
2 голосов
/ 23 ноября 2011

Я создал веб-сервис, который возвращает JSON или так, я думаю.Возвращенные данные выглядят так:

{"invoice":{"id":44,"number":42,"amount":1139.99,"checkoutStarted":true,"checkoutCompleted":true}}

Для меня это выглядит как действительный JSON.

Используя собственный сериализатор JSON в iOS5, я беру данные и собираю их как NSDictionary.

NSError *error;
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:[request responseData] options:kNilOptions error:&error];
    NSLog(@"json count: %i, key: %@, value: %@", [json count], [json allKeys], [json allValues]);

Вывод журнала:

json count: 1, key: (
    invoice
), value: (
        {
        amount = "1139.99";
        checkoutCompleted = 1;
        checkoutStarted = 1;
        id = 44;
        number = 42;
    }
)

Итак, мне кажется, что данные JSON имеют ключ NSString "invoice" и его значение равно NSArray ({amount = ..., check...})

Итак, я конвертирую значения в NSArray:

NSArray *latestInvoice = [json objectForKey:@"invoice"];

Но при переходе он говорит, что latestInvoice не является CFArray.если я распечатываю значения внутри массива:

for (id data in latestInvoice) {
        NSLog(@"data is %@", data);
    }

Результат:

data is id
data is checkoutStarted
data is ..

Я не понимаю, почему он возвращает только «id» вместо «id =»44" .Если я установлю для данных JSON значение NSDictionary, я знаю, что ключом является NSString, но каково значение?Это NSArray или что-то еще?

Это учебник, который я прочитал: http://www.raywenderlich.com/5492/working-with-json-in-ios-5

Редактировать: Исходя из ответа, кажется, что "значение" NSDictionary * json является еще однимNSDictionary.Я предполагаю, что это был NSArray или NSString, что неправильно.Другими словами, [K, V] для NSDictionary * json = [@ "invoice", NSDictionary]

Ответы [ 3 ]

5 голосов
/ 23 ноября 2011

Проблема в следующем:

NSArray *latestInvoice = [json objectForKey:@"invoice"];

На самом деле это должно быть:

NSDictionary *latestInvoice = [json objectForKey:@"invoice"];

... потому что у вас есть словарь, а не массив.

2 голосов
/ 23 ноября 2011

Ничего себе, собственный анализатор JSON, даже не заметил, что он был представлен.

NSArray *latestInvoice = [json objectForKey:@"invoice"];

На самом деле это NSDictionary, а не NSArray. Массивы не будут иметь ключей. Вы, кажется, способны отсюда.

1 голос
/ 03 октября 2012

Здесь, я думаю, вы должны принять такой вопрос

NSData* data = [NSData dataWithContentsOfURL: jsonURL];

NSDictionary *office = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

NSDictionary *invoice = [office objectForKey:@"invoice"];
...