18

昨晚我用 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 的文档,而且使用示例也更少。

4

5 回答 5

12

我是 TouchJSON 的作者。

您最外层的对象应该是字典而不是数组。字典以外的任何东西都是不合法的。如果您必须将数组作为最外层的对象,请使用该方法(在技术上已弃用,但不会很快出现)

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

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

于 2008-11-14T03:50:43.710 回答
8

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

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

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

祝你好运!

于 2008-11-14T00:15:36.720 回答
0

JSON 处理对象的核心,您的反序列化代码应如下所示

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

这确实适用于最新的结帐。

于 2008-11-14T03:40:56.803 回答
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"} 
   ] 
} 
于 2009-06-05T07:53:30.603 回答
0

不确定它是否对您有帮助,但请查看 http://tempered.mobi/%20

于 2010-05-09T23:41:04.020 回答