Ошибка анализа данных JSON - PullRequest
0 голосов
/ 29 марта 2012

У меня есть следующие данные JSON:

(
    3,
        {
        body = "123";
        date = 1333023644;
        mid = 12;
        "read_state" = 0;
    },
        {
        body = ":)";
        date = 1332968570;
        mid = 4;
        "read_state" = 1;
    },
        {
        body = "1234";
        date = 1331844024;
        mid = 1;
        "read_state" = 1;
    }
)

И я хочу получить массив значений тела с этим кодом:

NSArray *array = [dialogsDictionary objectForKey:@"body"];

Но я всегда получаю эту ошибку:

* Завершение работы приложения из-за необработанного исключения 'NSInvalidArgumentException', причина: '- [__ NSArrayM objectForKey:]: нераспознанный селектор отправлен в экземпляр 0x6b65a60'

Ответы [ 3 ]

1 голос
/ 30 марта 2012

Рассмотрим эту строку JSON.

  {
   "arrayOfData": [
    {
        "body": "123",
        "date": 1333023644,
        "mid": 12,
        "read_state": 0
    },
    {
        "body": ": )",
        "date": 1332968570,
        "mid": 4,
        "read_state": 1
    },
    {
        "body": "1234",
        "date": 1331844024,
        "mid": 1,
        "read_state": 1
    }
    ]
  }

Это допустимая строка JSON. Вы можете проверить действительность, используя http://jsonlint.com/

Предположим, у вас есть данные JSON в переменной jsonData, которая имеет тип NSData. Используя SBJSON , вы можете анализировать свой JSON как

  NSDictionary *jsonDictionary = [jsonData JSONValue];

  NSArray *array = [jsonDictionary objectForKey:@"arrayOfData"];

  NSMutableArray *result = [[NSMutableArray alloc]init];
  for(NSDictionary *dict in array){
      [result addObject:[dict objectForKey:@"body"]];
  }

После этой операции все значения для ключа body будут в массиве результатов.

Если '3' было счетчиком массива, вы могли бы включить это значение в JSON как

{
"numberOfElementsInArray": 3,
"arrayOfData": [
    {
        "body": "123",
        "date": 1333023644,
        "mid": 12,
        "read_state": 0
    },
    {
        "body": ": )",
        "date": 1332968570,
        "mid": 4,
        "read_state": 1
    },
    {
        "body": "1234",
        "date": 1331844024,
        "mid": 1,
        "read_state": 1
    }
]
}

См. это руководство по JSON. Вы должны прочитать этот веб-сайт, чтобы понять JSON

Добавлено Hot Licks

Что вы не понимаете, так это то, что исходный JSON был по сути такой:

[
    3,
    {
        "body": "123",
        "date": 1333023644,
        "mid": 12,
        "read_state": 0
    },
    {
        "body": ": )",
        "date": 1332968570,
        "mid": 4,
        "read_state": 1
    },
    {
        "body": "1234",
        "date": 1331844024,
        "mid": 1,
        "read_state": 1
    }
]

Он был отформатирован по-другому, потому что это был дамп объекта NSLog, а не исходный источник JSON. Совершенно законный JSON.

0 голосов
/ 29 марта 2012

похоже, что вы используете sudzc

попробовать:

if ([значение isKindOfClass: [класс NSError]] || [значение isKindOfClass: [класс SoapFault]]) {

    NSLog(@"%@", [value description]);
    return;
}

// Verify we're a dictionary
if( ![value isKindOfClass:[NSDictionary class]] ) {

    NSLog(@"ERROR: Response not a dictionary");
    return;
}

NSDictionary* dict = (NSDictionary*)value;
NSDictionary* resp = [dict objectForKey:@"3"];
if( ( resp == nil ) || ![resp isKindOfClass:[NSDictionary class]] ) {

    NSLog(@"ERROR: 3 not a dictionary");
    return;
}
dict = [resp objectForKey:@"body"];
if( ( dict == nil ) || ![dict isKindOfClass:[NSDictionary class]] ) {

    NSLog(@"ERROR: body not a dictionary");
    return;
}
resp = [dict objectForKey:@"date"];
if( ( resp == nil ) || ![resp isKindOfClass:[NSDictionary class]] ) {

    NSLog(@"ERROR: date not a dictionary");
    return;
}
0 голосов
/ 29 марта 2012

Указанный вами JSON недействителен.

   (

    {
    body = "123";
    date = 1333023644;
    mid = 12;
    "read_state" = 0;
},
    {
    body = ":)";
    date = 1332968570;
    mid = 4;
    "read_state" = 1;
},
    {
    body = "1234";
    date = 1331844024;
    mid = 1;
    "read_state" = 1;
}
)

Если ваши данные JSON похожи на приведенные выше, вам нужно написать

 for(NSDictionary *dict in Array){
  [result addObject:[dict objectForKey:@"body"]];
 }

Массив result будет содержать объекты словаря, соответствующие объекту body

...