【问题标题】:NSJSONSerialization - duplicate key error character at (index), char is ":"NSJSONSerialization - 在(索引)重复键错误字符,字符是“:”
【发布时间】:2012-08-16 05:35:31
【问题描述】:

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

Error Domain=NSCocoaErrorDomain Code=3840“操作无法完成。(Cocoa 错误 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 ...

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

【问题讨论】:

    标签: json nsjsonserialization


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • +1 让我重新评估我的 JSON 文件并发现那里的错误。代码没有错:P
      • 很好,是我的问题。
      猜你喜欢
      • 2022-01-16
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 2017-05-20
      • 2012-09-04
      • 1970-01-01
      • 2017-03-31
      • 2021-08-11
      相关资源
      最近更新 更多