如何在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