我想请一位 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(缩写版本):
$.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);
}
});
最佳答案
NaN
不是有效的 JSON 值。
A value can be a string in double quotes, or a number, or true or false or null, or an object or an array. These structures can be nested.
(source)
您需要在 python 中过滤掉这些值。
这并不是 JSON 规范中的“缺乏标准”,您只是输出了格式无效的 JSON。
至于为什么 MongoDB 返回 NaN
:
我猜测这是一个后备方案,然后将不是数字
的内容输入到本应是数字
的字段中>。为了类型安全,MongoDB 不能只返回该内容,因此它会为您提供它能告诉您的最好信息:NaN
。
请注意,NaN
是一个 JavaScript 概念。 JSON 受到 JS 对象表示法的启发,但在其他方面是不相关的。
关于javascript - 为什么 JSON 不支持 NaN 时 MongoDB 允许 NaN 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65565321/