【问题标题】:iOS 5 NSJSONSerialization ErroriOS 5 NSJSON序列化错误
【发布时间】:2013-08-28 21:24:19
【问题描述】:

我正在尝试使用 NSJSONSerialization 解析本地 JSON 文件。在 iOS 6 上运行良好,但在 iOS 5 上出现错误The operation couldn’t be completed. (Cocoa error 3840.)" (Duplicate key for object around character 1515.) 怎么可能在 iOS 5 上存在重复键,但在 iOS 6 上却没有?我尝试了各种 JSON 验证服务,所有这些服务都认为它是一个有效的 JSON 文件。我已经读过 \ 字符可能会导致这种情况,但我的 JSON 不包含使用 Find 验证的 \ 字符。如何在 iOS 5 上使这个 JSON 反序列化?

【问题讨论】:

  • 顺便说一句,如果事实证明您无法说服 Web 服务避免 JSON 对象上的重复键,您可以求助于第三方库。有一些,但我只能告诉一个库,它肯定有一个控制重复键行为的选项:JPJson。披露:嗯,我是作者;)

标签: cocoa ios5 nsjsonserialization


【解决方案1】:

根据RFC 4672,重复密钥并非无效。在 §2.2 中。对象,它只是声明:

“...对象中的名称应该是唯一的。”

“应该”一词的含义在RFC 2119中定义:

  1. 应该这个词,或形容词“推荐”,意味着有 在特定情况下可能存在忽略 特定项目,但必须了解全部含义并 在选择不同的课程之前仔细权衡。

也就是说,NSJSONSerialization 在 iOS 6 中的行为仍然“正确”。

IMO,关于重复键的行为应该是一个可配置的选项:

  1. 如果这是一个具有唯一键的关联容器(对于 NSDictionary 是正确的),则静默接受重复键并可能忽略生成的表示中的重复条目,或者
  2. 向错误控制台记录警告,或
  3. 发出错误信号。

【讨论】:

  • 有道理,我想在 iOS 5 中重复键被视为无效。我找到了有问题的键并对其进行了更改,现在它可以在 iOS 5 上正确反序列化。
  • 很好,重复键在找麻烦。最好避开它们。
猜你喜欢
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
相关资源
最近更新 更多