当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用TouchJSON反序列化复杂的JSON结果(字典数组)》经验,为你挑选了2个好方法。

我昨晚用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没有太多可用的文档,而且使用示例也少得多.



1> schwa..:

我是TouchJSON的作者.

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

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

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


根据Douglas Crockford自己创建的JSON RFC(http://www.ietf.org/rfc/rfc4627.txt),作为最外层对象的数组是完全有效的.有关其中的实际示例,请参见第7/8页.
那么,我们至少可以同意将数组作为最外层的对象是完全"合法的"吗?该帖子描述的是浏览器JavaScript解释器漏洞.数组是完全合法的,但可能只是你的图书馆没有正式支持.
在大多数语言中,做"++ i - ;"这样的事情也是完全合法的,这并不意味着它是一种好的做法.同样,反序列化不是对象的直数组也不是一个好习惯.只是因为你不能意味着你应该这样做.

2> rpj..:

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

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

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

祝好运!


链接已经死了!
推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有