Десериализация сложного результата JSON (массив словарей) с помощью TouchJSON - PullRequest
18 голосов
/ 14 ноября 2008

Прошлой ночью я провел несколько тестов с TouchJSON, и в простых случаях он работал довольно хорошо. Я использую следующий код для чтения содержимого JSON из файла и десериализации его:

NSString *jsonString = [[NSString alloc] initWithContentsOfFile:@"data.json"];
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF32BigEndianStringEncoding];
NSError *error = nil;
NSDictionary *items = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:&error];
NSLog(@"total items: %d", [items count]);
NSLog(@"error: %@", [error localizedDescription]);

Это прекрасно работает, если у меня есть очень простой объект JSON в файле (то есть словарь):

{"id": "54354", "name": "boohoo"}

Таким образом я смог получить доступ к массиву значений, так как я хотел получить элемент на основе его индекса в списке:

NSArray *items_list = [items allValues];
NSString *name = [items_list objectAtIndex:1];

(я понимаю, что мог бы получить имя с помощью словаря API)

Теперь я хотел бы десериализовать полусложную строку JSON, которая представляет собой массив словарей. Пример такой строки JSON приведен ниже:

[{"id": "123456", "name": "touchjson"}, {"id": "3456", "name": "bleh"}]

Когда я пытаюсь запустить тот же код выше для этого нового содержимого в файле data.json, я не получаю никаких результатов обратно. Мой вызов NSLog () говорит: «Всего элементов: 0», и в объекте NSError не возвращается ошибка.

Есть какие-нибудь подсказки о том, что происходит? Я совершенно заблудился, что делать, так как для TouchJSON не так много документации и примеров использования гораздо меньше.

Ответы [ 5 ]

12 голосов
/ 14 ноября 2008

Я автор TouchJSON.

Ваш внешний объект должен быть словарем, а НЕ массивом. Все, кроме словаря, не является законным. Если вам нужен массив в качестве внешнего объекта, используйте метод (который технически устарел, но никуда не денется)

- (id)deserialize:(NSData *)inData error:(NSError **)outError;

См. http://www.json.com/json-schema-proposal/ для получения дополнительной информации о том, что является и не является законным JSON.

8 голосов
/ 14 ноября 2008

Это не ответ, а указатель на другую структуру:

http://code.google.com/p/json-framework/

В последнее время я довольно часто этим пользуюсь, сериализуя и десериализуя сложные структуры данных сторонних сервисов, таких как Google Local, и между моим собственным Objective-C и Perl-кодом без проблем. Не говоря уже о том, что с API смехотворно легко иметь дело.

Удачи!

0 голосов
/ 10 мая 2010

Не уверен, поможет ли вам это, но проверьте это http://tempered.mobi/%20

0 голосов
/ 05 июня 2009

@ Матье - я думаю, это то, что вы ищете (на 6 месяцев позже, я знаю :), но я столкнулся с той же проблемой)

Скопируйте и вставьте отсюда: http://groups.google.com/group/touchcode-dev/browse_thread/thread/ada885832019f45b

NSArray *tweetsArray = [resultsDictionary objectForKey:@"results"]; 
for (NSDictionary *tweetDictionary in tweetsArray) { 
  NSString *tweetText = [tweetDictionary objectForKey:@"text"]; 
  [tweets addObject:tweetText]; 
} 

Чтобы получить больше контекста, JSON, который я анализирую, имеет общий вид
из:

{"results": 
   [ 
     {"text":"tweet1"}, 
     {"text":"tweet2"}, 
     {"text":"tweet3"} 
   ] 
} 
0 голосов
/ 14 ноября 2008

По своей сути JSON имеет дело с объектами, ваш код для десериализации должен выглядеть следующим образом

{"objects":[{"id": "123456", "name": "touchjson"}, {"id": "3456", "name": "bleh"}]}

, который работает с последней проверкой.

...