有一个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"]')
是否在JSON.parse()中设置标志? 还是接受NaN
为文字的替代解析器?
我已经搜索了一段时间,但似乎找不到有关此问题的文档。
有一个node.js应用程序正在接收包含文字NaN的JSON数据字符串,例如
然后,您的NodeJS应用程序 不
接收JSON,而是接收模糊的类似于JSON的文本。NaN
不是有效的JSON令牌。
三种选择:
这显然是首选课程。数据不是JSON,应该修复,这将解决您的问题。
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
从未出现在适当的位置,这同样具有思维简单的问题。
eval
如果您知道并信任此数据的来源,并且不可能在传输过程中对其进行篡改
,则可以使用eval
而不是来解析它JSON.parse
。由于eval
允许使用完整的JavaScript语法(包括)NaN
,因此有效。希望我对html" target="_blank">用户的警告足够大胆,使他们理解我只会在非常,非常,
非常 小的情况下建议这样做。但是同样,请记住eval
允许任意执行代码,因此,如果字符串有被篡改的可能性,请不要使用它。
问题内容: 在我的网站中,我尝试将字符串转换为包含换行符的JSON。 这将产生“意外令牌”错误。我需要以某种方式逃脱吗? 问题答案: 是的,您应该同时退出这两个字符,因为它们都属于控制字符列表。您可以在此处找到需要转义的字符的完整列表。您的代码将是 JSFiddle:链接
问题内容: 有没有一种方法可以将Typescript中的字符串解析为JSON。 示例:在JS中,我们可以使用。Typescript中有类似的功能吗? 我有一个JSON对象字符串,如下所示: 问题答案: Typescript是javascript(的超集),因此您可以像在javascript中那样使用它: 只有在打字稿中,您才能对结果对象进行打字: (操场上的代码)
问题内容: 我正在从服务器获取JSON字符串,并且已经通过代码获取了JSON字符串。但是我不知道如何解析它。 以下是我的JSON字符串 请提供任何指导或代码段。 问题答案: 使用JSON类进行解析,例如
在typescript中有没有一种方法可以将字符串解析为JSON。 示例:在JS中,我们可以使用。在Typescript中有类似的功能吗? 我有一个JSON对象字符串,如下所示:
问题内容: 我在尝试使用265,858解析时得到提示。 有什么办法可以将其解析为整数? 问题答案: 这个逗号是小数点分隔符还是这两个数字?在第一种情况下,您必须提供给使用逗号作为小数点分隔符的类: 结果是。但是使用美国语言环境,您将获得: 这是因为在法国他们将逗号视为小数点分隔符,而在美国将它们视为分组(千位)分隔符。 如果这是两个数字- 它们分别解析两个单独的字符串。