2008-11-13 1 views
18

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

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]; 

(Я понимаю, что я мог бы Фет ched имя со словарем API)

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

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

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

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

ответ

8

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

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

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

Удачи вам!

+0

Спасибо, я смог выяснить, как десериализовать эту сложную строку JSON с json-framework. – jpm 2008-11-14 03:47:33

+0

Я использую эту фреймворк для сложных json-структур и до сих пор не столкнулся с какими-либо проблемами. – seanalltogether 2008-11-14 03:47:47

+2

Ссылка мертва! – Gustav 2012-06-29 08:26:14

0

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

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

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

12

Я автор TouchJSON.

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

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

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

0

@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, что я синтаксический анализ в общем виде
из:

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