Javascript 当JSON不支持NaN时,为什么MongoDB允许NaN值?

Javascript 当JSON不支持NaN时,为什么MongoDB允许NaN值?,javascript,json,python-3.x,mongodb,nan,Javascript,Json,Python 3.x,Mongodb,Nan,我想从Mongo的专家那里了解一下。到目前为止,答案来自JavaScript方面 这是我的设想。我使用Python/Pandas读取CSV并转换为JSON以存储在MongoDB中。我还有一个暴露于JavaScript的Python AWS Lambda API。值不好的数据最终得到的值为NaN,MongoDB接受这一点很好,Python字典处理得很好,并序列化为JSON。但是JavaScript无法解析它。我的临时解决方案是暂时将NaN更改为0(在数据库中) 我试图理解为什么MongoDB/Py

我想从Mongo的专家那里了解一下。到目前为止,答案来自JavaScript方面

这是我的设想。我使用Python/Pandas读取CSV并转换为JSON以存储在MongoDB中。我还有一个暴露于JavaScript的Python AWS Lambda API。值不好的数据最终得到的值为NaN,MongoDB接受这一点很好,Python字典处理得很好,并序列化为JSON。但是JavaScript无法解析它。我的临时解决方案是暂时将NaN更改为0(在数据库中)

我试图理解为什么MongoDB/Python允许这样做,但JavaScript不允许。是因为JSON本身缺乏标准吗

如果我把它放到JSONLint.com中,它会很快发现问题

{
    "name": "test",
    "value": NaN
}
在JavaScript中,我们在Ajax调用(简化版本)上得到一个ParseError:


NaN
不是有效的JSON值

值可以是双引号中的字符串、数字、true或false或null、对象或数组。这些结构可以嵌套。
()

您需要在python中过滤掉这些值

在JSON规范中,这并不是“缺少标准”,而是输出格式无效的JSON


至于MongoDB返回NaN的原因:


我猜这是一个回退,然后一些不是
数字
的内容被输入到一个应该是
数字
的字段中。出于类型安全考虑,MongoDB不能只返回该内容,因此它提供了它所能告诉您的最好信息:
NaN


请注意,
NaN
是一个JavaScript概念。JSON的灵感来自JS的对象表示法,但它在其他方面是不相关的。

NaN
不是有效的JSON值

值可以是双引号中的字符串、数字、true或false或null、对象或数组。这些结构可以嵌套。
()

您需要在python中过滤掉这些值

在JSON规范中,这并不是“缺少标准”,而是输出格式无效的JSON


至于MongoDB返回NaN的原因:


我猜这是一个回退,然后一些不是
数字
的内容被输入到一个应该是
数字
的字段中。出于类型安全考虑,MongoDB不能只返回该内容,因此它提供了它所能告诉您的最好信息:
NaN

请注意,
NaN
是一个JavaScript概念。JSON的灵感来自JS的对象表示法,但它在其他方面是不相关的。

这是因为NaN是:

数字

禁止使用前导零。小数点必须为 后跟至少一个数字。不支持NaN和Infinity

那是因为NaN是:

数字

禁止使用前导零。小数点必须为 后跟至少一个数字。不支持NaN和Infinity


那么MongoDB是如何接受它的,不是基于JSON的吗?那么MongoDB是如何接受它的,不是基于JSON的吗?那么MongoDB是如何接受它的,不是基于JSON的吗?我猜这是一个回退,然后一些不是
数字的东西被输入到一个应该是
数字的字段中。出于类型安全考虑,MongoDB不能只返回该内容,因此它提供了它所能告诉您的最好信息:
NaN
。请注意,
NaN
是一个JavaScript概念。JSON的灵感来源于JS的对象表示法,但它在其他方面是不相关的。Pandas在数据帧中将值设置为NaN,该数据帧放在Python字典中,Python使用PyMongo将其存储在MongoDB中。因此,我试图了解MongoDB“JSON”与JavaScript“JSON”的区别——如果这有意义的话。然后Lambda也使用Python序列化了“JSON”,它没有问题,我不知道该告诉你什么。JSON规范很清楚,
NaN
是不允许的,就这么简单。您需要在服务器端修复此问题。此问题已修复。问题不在于Javascript是否支持NaN,而在于如何在不一致的情况下处理整个堆栈。那么MongoDB如何接受它,它不是基于JSON的吗?我猜这是一个回退,然后将一些不是
数字的内容输入到一个应该是
数字的字段中。出于类型安全考虑,MongoDB不能只返回该内容,因此它提供了它所能告诉您的最好信息:
NaN
。请注意,
NaN
是一个JavaScript概念。JSON的灵感来源于JS的对象表示法,但它在其他方面是不相关的。Pandas在数据帧中将值设置为NaN,该数据帧放在Python字典中,Python使用PyMongo将其存储在MongoDB中。因此,我试图了解MongoDB“JSON”与JavaScript“JSON”的区别——如果这有意义的话。然后Lambda也使用Python序列化了“JSON”,它没有问题,我不知道该告诉你什么。JSON规范很清楚,
NaN
是不允许的,就这么简单。您需要在服务器端修复此问题。此问题已修复。问题不在于Javascript是否支持NaN,而在于如何处理不一致的完整堆栈。
    $.ajax({
        type: "POST",
        url: "https://da987tkpjg.execute-api.us-east-1.amazonaws.com/PROD",
        data: JSON.stringify({
            "body":{ ...
            }
        }),
        success: function(msg){
            console.log(msg);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            console.log(textStatus);
            console.log(errorThrown);
        }
      });