JSON.stringify 丢弃不可串值,这是为什么呢?

时间:2021-04-15 13:23:17

标签: javascript node.js json

我很难理解 JSON.stringify 在 Node.js 环境中工作时会丢弃一些非字符串化字段的数据。

我不明白的是:

  1. 如果我们有有效的 JSON 并且我们有作为函数的值,我们就不能将它字符串化:

var foo = {func : function () {}};
console.log(JSON.stringify(foo))

  1. 如果我们有一个包含不可字符串化(不明白它们是什么)字段的数组,我们不能对它们进行字符串化,而是在它们的索引上得到 null :

var arr = [function(){} , 'Walk', undefined ];
console.log(JSON.stringify(arr));

这一切都发生在我创建对象的深层副本时,它会删除关键数据。我真的很难把它附加到问题上。我只需要知道一般情况下什么时候会下降,这背后一定有逻辑。我一直在浏览网页,但找不到任何可以帮助我了解其背后功能的资源/博客。

谁能帮我理解它是什么?或者分享一个好的链接或博客,可以帮助我消除疑虑?

3 个答案:

答案 0 :(得分:2)

我认为这可能是答案?如果没有,请告诉我。

  1. 您为外部绑定获取 {},内部 func : function(){} 返回 undefined,因此不是有效的 json。

  2. 当您尝试将无法转换为 json 的内容(即未定义或函数声明)进行字符串化时,您会得到 null。

答案 1 :(得分:2)

一般来说,为了防止意外,你应该确保它只包含数组、对象、字符串、数字、布尔值和空值。

如果你真的需要保留函数属性,你可以使用 JSON.stringify 的第二个参数来描述你想如何处理它。

例如

let obj = { 
  func: function () { }
}

let json = JSON.stringify(obj, function (key, value) {
  
  if (typeof value === "function") {
    return "this is a function";
  } else {
    return value;
  }
  
})

console.log(json);

Mozilla 网页描述了它最初是如何工作的。

<块引用>

未定义、函数和符号不是有效的 JSON 值。如果在转换过程中遇到任何这样的值,它们要么被省略(在对象中找到时),要么更改为 null(在数组中找到时)。当传入像 JSON.stringify(function(){}) 或 JSON.stringify(undefined) 这样的“纯”值时,JSON.stringify() 可以返回 undefined。

JSON.stringify() - JavaScript | MDN

答案 2 :(得分:2)

JSON 是一种数据交换格式。它用于传输数据,与使用的语言无关。通常,如果某些属性/值与语言相关,则转换为 JSON 时它不是有效值。

JSON standard 定义了许多可以在 JSON 中使用的值类型。

对于 JSON.stringify(),发生以下情况:

  • 当一个值被转换为 JSON 时,如果合适,它会被转换为它的 JSON 形式,或者作为 undefined 返回。
  • 当一个对象被转换为 JSON 时,该对象的每个属性都会被转换为它的 JSON 形式(如果合适或被省略)(因为转换后的值将是 undefined)。
  • 当数组转换为 JSON 时,数组的每个元素都将转换为其 JSON 形式(如果合适)或替换为 null

可以使用 custom "replacer" function 作为第二个参数传递给 JSON.stringify() 来覆盖此行为。

相关问题