当前位置: 首页 > 面试题库 >

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

端木夕
2023-03-14
问题内容

有一个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令牌。

三种选择:

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,因此有效。希望我对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解析时得到提示。 有什么办法可以将其解析为整数? 问题答案: 这个逗号是小数点分隔符还是这两个数字?在第一种情况下,您必须提供给使用逗号作为小数点分隔符的类: 结果是。但是使用美国语言环境,您将获得: 这是因为在法国他们将逗号视为小数点分隔符,而在美国将它们视为分组(千位)分隔符。 如果这是两个数字- 它们分别解析两个单独的字符串。