Подтвердить что ты не робот

Уничтожение сложного результата JSON (массив словарей) с TouchJSON

Вчера вечером я провел несколько тестов с 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() говорит "total items: 0", и ошибка в объекте NSError не возвращается.

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

4b9b3361

Ответ 1

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

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

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

Удачи!

Ответ 2

Я автор TouchJSON.

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

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

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

Ответ 3

В этом сердце JSON имеет дело с объектами, ваш код для де-сериализации должен быть следующим:

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

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

Ответ 4

@Mathieu - Я думаю, что это то, что вы ищете (спустя 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, который я обрабатываю, находится в общем виде
of:

{"results": 
   [ 
     {"text":"tweet1"}, 
     {"text":"tweet2"}, 
     {"text":"tweet3"} 
   ] 
} 

Ответ 5

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