使用TouchJSON反序列化复杂的JSON结果(字典数组)

时间:2008-11-13 21:33:00

标签: iphone 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()调用显示“总项数:0”,并且NSError对象中没有错误返回。

有关正在发生的事情的任何线索?我完全不知道该做什么,因为TouchJSON没有太多可用的文档,而且使用示例也少得多。

5 个答案:

答案 0 :(得分:12)

我是TouchJSON的作者。

您的最外层对象应该是字典而不是数组。除字典之外的任何东西都是不合法的。如果你必须有一个数组作为最外面的对象,那么使用该方法(技术上已弃用,但不会很快到达)

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

请参阅:http://www.json.com/json-schema-proposal/了解更多信息,了解什么是合法的JSON。

答案 1 :(得分:8)

这不是答案,而是指向不同框架的指针:

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

我最近一直在使用它,从第三方服务(如Google Local)以及我自己的Objective-C和Perl代码之间序列化和反序列化复杂的数据结构,绝对没有问题。更不用说API非常容易处理了。

祝你好运!

答案 2 :(得分:0)

在它的核心JSON处理对象,你的反序列化代码应该如下

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

适用于最新的结帐。

答案 3 :(得分: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是一般形式的 of:

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

答案 4 :(得分:0)

不确定它是否对您有所帮助但是检查出来 http://tempered.mobi/%20