保留未定义的JSON.stringify否则将删除

bod*_*ydo 60 javascript json

在执行JSON.stringify(hash)时如何保留未定义的值?

这是一个例子:

var hash = {
  "name" : "boda",
  "email" : undefined,
  "country" : "africa"
};

var string = JSON.stringify(hash);

> "{"name":"boda","country":"africa"}"
Run Code Online (Sandbox Code Playgroud)

电子邮件从JSON.stringify中消失了.

Fli*_*imm 91

您可以传递一个替换器函数来JSON.stringify自动将undefined值转换为null值,如下所示:

var string = JSON.stringify(
  obj,
  function(k, v) { return v === undefined ? null : v; }
);
Run Code Online (Sandbox Code Playgroud)

这适用于数组内部的未定义值,因为JSON.stringify已经将它们转换为null.

  • ES6:`JSON.stringify(obj,(k,v)=> v === undefined?null:v)` (12认同)
  • 虽然这是一个解决方案但它没有解决问题,因为它没有将值保留为未定义,它将其更改为null. (4认同)
  • @Flimm 是的,我知道,但这仍然不能解决问题。 (4认同)
  • @Peter JSON仅允许“空”值,而在JSON标准中没有定义“未定义”值。 (2认同)
  • 您也可以使用其他不可显示的值来执行此操作,例如函数 `return typeof v === 'function' ? '功能':v;` (2认同)

chi*_*ens 9

您可以通过转换为来保留密钥,null因为有效的 JSON 不允许undefined

简单的一个班轮:

JSON.stringify(obj, (k, v) => v === undefined ? null : v)
Run Code Online (Sandbox Code Playgroud)

  • “你可以通过改变它来保存它”;) (5认同)

Efo*_*fog 8

null而不是undefined.

var hash = {
  "name" : "boda",
  "email" : null,
  "country" : "africa"
};

var string = JSON.stringify(hash);

> "{"name":"boda","email":null,"country":"africa"}"
Run Code Online (Sandbox Code Playgroud)

  • 这不是回答问题。 (3认同)

tan*_*y_k 7

function stringifyWithUndefined(value: any, space: number): string {
  const str = JSON.stringify(
    value,
    (_k, v) => v === undefined ? '__UNDEFINED__' : v,
    space
  );
  return str.replaceAll('"__UNDEFINED__"', 'undefined');
}
Run Code Online (Sandbox Code Playgroud)

示例1:

const object = {
  name: 'boda',
  email: undefined,
  country: 'africa'
};
console.log(stringifyWithUndefined(object, 2));
Run Code Online (Sandbox Code Playgroud)

结果(字符串):

{
  "name": "boda",
  "email": undefined,
  "country": "africa"
}
Run Code Online (Sandbox Code Playgroud)

示例2:

const array = [object, { object }, [[object]]];
console.log(stringifyWithUndefined(array, 2));
Run Code Online (Sandbox Code Playgroud)

结果(字符串):

[
  {
    "name": "boda",
    "email": undefined,
    "country": "africa"
  },
  {
    "object": {
      "name": "boda",
      "email": undefined,
      "country": "africa"
    }
  },
  [
    [
      {
        "name": "boda",
        "email": undefined,
        "country": "africa"
      }
    ]
  ]
]
Run Code Online (Sandbox Code Playgroud)



请注意,这undefined不是有效的 JSON,如果您给出以下结果,JSON.parse()则会失败SyntaxError: Unexpected token [...] is not valid JSONstringifyWithUndefined()


Ziz*_*aco 7

这应该可以解决问题

// Since 'JSON.stringify' hides 'undefined', the code bellow is necessary in
// order to display the real param that have invoked the error.
JSON.stringify(hash, (k, v) => (v === undefined) ? '__undefined' : v)
    .replace('"__undefined"', 'undefined')
Run Code Online (Sandbox Code Playgroud)

  • 我相信替换正则表达式会更好: JSON.stringify(hash, (k, v) => (v === undefined) ? '__undefined' : v) .replace(/\"__undefined\"/g, 'undefined ') 因为您的示例将仅替换第一个匹配项 (6认同)
  • 此代码的问题在于,对于恰好包含“__undefined”的字符串,它将无法正常工作。此外,它还会生成无法被“JSON.parse”解析的无效 JSON (2认同)