2008-11-13 120 views
18

昨晚我使用TouchJSON做了一些测试,它对于简单的情况一般工作得很好。我使用下面的代码从文件中读取一些JSON内容,并反序列化:使用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]; 

(据我所知,我能有FET用字典API加上名字)

现在我想反序列化一个半复杂的JSON字符串,它代表一个字典数组。这样的JSON字符串的例子下面是:

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

当我尝试对在data.json文件这一新的内容上面运行相同的代码,我没有得到任何结果回来。我的NSLog()调用说“总项目:0”,并没有错误返回到NSError对象中。

发生了什么事情的线索?我完全不知道该怎么做,因为没有太多针对TouchJSON的文档,以及更少的使用示例。

回答

8

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

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

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

祝你好运!

+0

谢谢,我能弄清楚如何反序列化与JSON框架复杂的JSON字符串。 – 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"} 
    ] 
}