【问题标题】:JSON.net Deserialization failing with doublequotes in jsonJSON.net 反序列化失败,json 中出现双引号
【发布时间】:2012-02-21 13:32:55
【问题描述】:

我有一个由 JSON.net 序列化的对象,发送到 javascript 客户端,该客户端将其转换为 javascript 对象。该对象可以由用户编辑,然后 javascript 使用 JSON.stringify(myObject) 将其转换回 json 并通过 ajax 将其传递回使用 JSON.net 将 json 反序列化回原始对象的方法。

所有这些都可以正常工作,直到我在对象上有一个包含双引号的值,此时 JSON.net 反序列化失败。

以下是发送到 JSON.net 进行反序列化的 JSON 示例:

"{
   \"$id\":\"1\",
   \"Treatment_ID\":36050,
   \"Project_Classification\":\"MCPM\",
   \"Improvement_Type\":\"Cape Seal\",
   \"Jurisdiction\":\"24120\",
   \"Description\":\"\",
   \"Planned\":true,
   \"Comment\":\"test22 2\"\"
}"

所有双引号都被自动转义。如果它们没有被转义,json 看起来更像这样:

"{
   "$id":"1",
   "Treatment_ID":36050,
   "Project_Classification":"MCPM",
   "Improvement_Type":"Cape Seal",
   "Jurisdiction":"24120",
   "Description":"",
   "Planned":true,
   "Comment":"test22 2\""
}"

如何克服这种行为?

【问题讨论】:

  • 您是依赖浏览器的 JSON.stringify 实现还是依赖库的实现? JSON.stringify 应该只在 "Comment" 的值中转义双引号。
  • 我相信是浏览器的实现。我的 javascript 中没有任何引用,我将 JSON 定义为其他内容。上面的例子是在 FireFox 9 中。
  • @AmandaMyer - 如果您认为问题是特定于浏览器的,请尝试Douglas Crockord's stringifier

标签: javascript ajax serialization json.net


【解决方案1】:

不受欢迎的 JSON 格式在有问题的引号前只有一个反斜杠,与用于 JSON 结构本身的引号一样多。我的猜测是它应该有三个:两个在结果字符串中创建一个“真正的”反斜杠字符,另一个让引号不结束字符串。 (请注意,您当前拥有的东西作为字符串或对象都没有意义,这是由 SO 的代码突出显示的事实)

根据您的问题,我无法完全确定“所有双引号都被自动转义”的位置。在JSON.stringify 中没有浏览器这样做。我希望 JSON.net 也不会乱来。因此,无论是执行 ajax 请求的客户端,还是将其传递给 JSON.net 的服务器上的中间件,都在中断。您需要发布更多关于存在什么的详细信息,以便找出问题所在。

【讨论】:

  • 好吧,根据萤火虫的说法,FireFox 正在这样做。我查看了 FireBug 中 JSON.stringify(myObject) 的结果,它显示的结果与我发布的第一个示例完全相同。当我在 stringify 操作之前检查对象时,“Comment”字段设置为“test 2\””。
  • 不要相信 Firebug。它对字符串引用做了一些有趣的事情,以使变量“更具可读性”。相反,在控制台中运行:alert(JSON.stringify(myObject).toSource()) 这将生成有效的 JS,您可以使用它来检查字符串中的数据。
  • 更好的是,查看实际发送到服务器的数据,例如实时 HTTP 标头。
猜你喜欢
  • 1970-01-01
  • 2015-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
相关资源
最近更新 更多