我创建了一个servlet,它响应从json数据创建的字节数组获取请求。我试图在iOS中使用这些数据并使用NSJSONSerialization将其解析为NSDictionary,但它失败并出现以下错误
错误域= NSCocoaErrorDomain代码= 3840“该操作不能完成。(可可错误3840)”(重复键周边的字符11.对象)的UserInfo = 0x6833200 {周边的字符11对象NSDebugDescription =重复键。 }
这是我的代码:
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),因为存在错误 我猜这与我的服务器将输出流中的数据作为byte [](java)发送的事实有关,并且在iOS中接收时它没有正确格式化为json,但它没有意义对我来说,为什么它会在角色11“:”失败 仅供参考,服务器使用java编写在Google App Engine上,localhost url是本地开发服务器。 json数据是使用Jackson Generator库创建的。谢谢!
答案 0 :(得分:2)
我自己发现了答案:当错误指向“:”字符处的重复键时,这意味着以下json数组中的某些键是重复的,不一定是紧跟在该字符索引之后的键。从我上面的json数据中,我有很多“APPEAL”条目,当转换为NSDictionary时会抛出一个错误,因为给定键只能有一个值。我相信我的困惑来自于阅读Jackson json生成器教程,该教程描述了使用相同的密钥创建条目,以便以后可以将它们序列化为对象的许多实例,并使用“key”作为对象类名称(因此我可以创建许多APPEAL使用Jackson解析器的对象,但在NSJSONSerialization中却不是这样。)
我还连接了几个json文件服务器端:
({“table”:{“title”:value}} {“anotherTable”:{“title”:value}})
这样我的网址请求响应可以提供1个请求(成本效率)的多个文件,但这些必须分开客户端并单独序列化,因为“}} {”不是合法的json格式。
答案 1 :(得分:0)
json有一个重复键。例如,{“json”:“3”,“string”:“34”,“json”:“3”}。在iOS6.0之前无法解析json