【发布时间】:2013-02-20 03:22:08
【问题描述】:
有一个 node.js 应用程序正在接收包含文字 NaN 的 JSON 数据字符串,例如
"[1, 2, 3, NaN, 5, 6]"
这会使 Node.js 中的 JSON.parse(...) 崩溃。我想把它解析成一个对象。
我知道NaN 不是 JSON 规范的一部分。大多数 SO 链接 (sending NaN in json) 建议修复输出。
在这里,虽然数据是在我无法控制的服务器中生成的,但它是由一个商业 Java 库生成的,我可以在其中查看源代码。它是由 Google 的 Gson 库生成的:
private Gson gson = (new GsonBuilder().serializeSpecialFloatingPointValues().create());
...
gson.toJson(data[i], Vector.class, jsonOut)
所以这似乎是一个合法的来源。根据Gson API Javadoc,它说我应该能够解析它:
JSON 规范的第 2.4 节不允许特殊的双精度值 (NaN,无穷大,-无穷大)。然而,Javascript 规范(见 第 4.3.20、4.3.22、4.3.23 节)允许这些值有效 Javascript 值。此外,大多数 JavaScript 引擎都会接受这些 JSON中的特殊值没有问题。所以,在实践层面,它 接受这些值作为有效的 JSON 是有意义的,即使 JSON 规范不允许它们。
尽管如此,这在 Node.js 和 Chrome 中都失败了:JSON.parse('[1,2,3,NaN,"5"]')
JSON.parse() 中有设置标志吗?还是接受NaN 作为文字的替代解析器?
我已经在谷歌上搜索了一段时间,但似乎找不到关于这个问题的文档。
【问题讨论】:
-
我觉得讽刺的是,Google 的 Gson 项目说 JSON 解析器应该允许这些文字,而不能容忍它们的 JavaScript 引擎是 Google 自己的 V8。
-
@cdhowie 节点的 JSON 解析器只是遵循规范。 “讽刺”只是违反the robustness principle.
-
@MattBall 不,具有讽刺意味的是,一个 Google 项目说 “大多数 JavaScript 引擎将毫无问题地接受 JSON 中的这些特殊值”,而 Google 的 JavaScript 引擎是其中之一Chrome 也不喜欢该字符串这一事实证明了例外情况。
-
“第 1.2 节描述了 JSON。但是,TCP/IP 协议支持许多其他格式,只要付出足够的努力或无视安全性,您应该能够解码。因此,我们想,为什么要限制自己使用 JSON? " - 谷歌