如何在Node.js中解析包含“ NaN”的JSON字符串

有一个node.js应用程序正在接收包含文字NaN的JSON数据字符串,例如

 "[1, 2, 3, NaN, 5, 6]"

JSON.parse(...)Node.js中崩溃。如果可以,我想解析它。

我知道NaN这不是JSON规范的一部分。大多数SO链接(在json中发送NaN812/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,Infinity,-Infinity)。但是,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"]')

我已经搜索了一段时间,但似乎找不到有关此问题的文档。

回答:

有一个node.js应用程序正在接收包含文字NaN的JSON数据字符串,例如

然后,您的NodeJS应用程序

接收JSON,而是接收模糊的类似于JSON的文本。NaN不是有效的JSON令牌。

三种选择:

1.获取源以正确生成JSON

这显然是首选课程。数据不是JSON,应该修复,这将解决您的问题。

2. NaN以一种简单的方式容忍:

您可以null在解析之前将其替换为,例如:

var result = JSON.parse(yourString.replace(/\bNaN\b/g, "null"));

…然后处理null结果中的。但这很简单,不允许字符NaN出现在字符串中的某个位置。

或者,旋转Matt Ball的reviver想法 (现已删除)

,您可以将其更改为特殊的字符串(例如"***NaN***"),然后使用齐整器将其替换为real NaN

var result = JSON.parse(yourString.replace(/\bNaN\b/g, '"***NaN***"'), function(key, value) {

return value === "***NaN***" ? NaN : value;

});

…但是,假设字符NaN从未出现在适当的位置,这同样具有思维简单的问题。

3.使用 (颤抖!)eval

,则可以使用eval而不是来解析它JSON.parse。由于eval允许使用完整的JavaScript语法(包括)NaN,因此有效。希望我对用户的警告足够大胆,使他们理解我只会在非常,非常,

非常 小的情况下建议这样做。但是同样,请记住eval允许任意执行代码,因此,如果字符串有被篡改的可能性,请不要使用它。

以上是 如何在Node.js中解析包含“ NaN”的JSON字符串 的全部内容, 来源链接: utcz.com/qa/411133.html

回到顶部