0

我创建了一个 servlet,它使用从 json 数据创建的字节数组来响应获取请求。我正在尝试在 iOS 中使用这些数据并使用 NSJSONSerialization 将其解析为 NSDictionary,但它失败并出现以下错误

错误域 = NSCocoaErrorDomain 代码 = 3840 “操作无法完成。(可可错误 3840。)”(字符 11 周围对象的重复键。) UserInfo = 0x6833200 {NSDebugDescription =字符 11 周围对象的重复键。}

这是我的代码:

NSString *query = @"http://localhost:8888/url?method=retrieve";

NSData *jsonData = [NSData dataWithContentsOfURL:[NSURL URLWithString:query]];
NSError *error = nil;
NSString *stringData = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"substring to index 255: %@",  [stringData substringToIndex:255]);
NSDictionary *results = jsonData ? [NSJSONSerialization JSONObjectWithData:[stringData dataUsingEncoding:NSUTF8StringEncoding] options:kNilOptions error:&error] : nil;
NSLog(@"Response as Dictionary:\n%@", results.description);
if (error) {
    NSLog(@"Error: %@", error);
}

stringData 的值为

{"APPEALS":{"APPEAL":{"AppealID":387423483,"LastEdit":"1 ...

响应作为字典返回(null)显然因为有一个错误我猜它与我的服务器将输出流中的数据作为字节[](java)发送并且它的格式不正确的事实有关在 iOS 中收到 json 时,但我不明白为什么它会在字符 11“:”处失败 仅供参考,服务器是用 Java 编写在 Google App Engine 上的,localhost url 是本地开发服务器。json 数据是使用 Jackson Generator 库创建的。谢谢!

4

2 回答 2

2

我自己找到了答案:当错误指向“:”字符处的重复键时,这意味着以下 json 数组中的某个键被重复,不一定是紧跟该字符索引的那个键。从上面的 json 数据中,我有许多“APPEAL”条目,当变成 NSDictionary 时会抛出错误,因为给定键只能有 1 个值。我相信我的困惑源于阅读杰克逊 json 生成器教程,该教程描述了使用相同的键创建条目,以便以后可以将它们序列化为具有“键”作为对象类名称的对象的许多实例(所以我可以创建许多 APPEAL使用 Jackson 解析器的对象,但在 NSJSONSerialization 中不是这样)。

我还在服务器端连接了几个 json 文件:

( {"table":{"title":value}}{"anotherTable":{"title":value}} )

这样我的 url 请求响应可以为多个文件提供 1 个请求(成本效率),但这些文件必须在客户端拆分并单独序列化,因为“}}{”不是合法的 json 格式。

于 2012-08-21T15:47:46.847 回答
0

json有重复key。例如,{"json":"3","string":"34","json":"3"}。在iOS6.0之前无法解析json。

于 2013-12-11T03:26:11.527 回答