javascript JSON.stringifyは「undefined」が削除されてしまう

javascript JSON.stringifyは「undefined」が削除されてしまう

javascriptでオブジェクトをjson形式の文字列に変換する「JSON.stringify」は「value」に「undefined」が存在すると削除されます。また、「関数」や「Symbol」も同様に削除されます。

環境

  • OS windows11 pro 64bit
  • ブラウザ chrome 107.0.5304.107

「undefined」が削除される

「JSON.stringify」を「undefined」を含むオブジェクトに使用すると「undefined」があるキーは削除されて表示されます。

const obj = {
  a: undefined,
  b: 'bbb',
  c: undefined,
  d: 'ccc',
  e: undefined,
};

console.log(JSON.stringify(obj)); 
// {"b":"bbb","d":"ccc"} ← 削除される

これは「JSON.stringify」の仕様なようで、他にも「関数」や「Symbol」も削除されるようです。
試しに、複数のパターンで実行してみます。

const obj = {
  a: 'str',
  b: -1.01,
  c: true,
  d: false,
  e: null,
  f: NaN,
  g: Infinity,
  h: 0xFF,
  i: [1],
  j: {a:1},
  k: new Date(),
  l: new Map([[1, "a"], [2, "b"]]),
  m: void 0, // void 0 は Undefinedが返ります
  n: undefined,
  o: ()=>{},  
  p: Symbol('hoge'),
  q: [1,undefined],
  r: {a:undefined},
};

console.log(JSON.stringify(obj)); 

見やすいように整形してから実行結果を確認してみます。

{
	"a": "str",
	"b": -1.01,
	"c": true,
	"d": false,
	"e": null,
	"f": null,
	"g": null,
	"h": 255,
	"i": [
		1
	],
	"j": {
		"a": 1
	},
	"k": "2022-11-18T01:39:01.059Z",
	"l": {},
	"q": [
		1,
		null
	],
	"r": {}
}

仕様通り、削除されていることが確認できます。また、「NaN」や「Infinity」は「null」に変換されていることも確認でき、配列内にあた「undefined」も「null」に変換されてます。
「Map」や「Set」は、空のオブジェクトが返ります。

どうしても「undefined」を表示したい場合は、文字列に変換して表示する方法などがあります。

const obj = {
  a: undefined,
  b: 'bbb',
  c: undefined,
  d: 'ccc',
  e: undefined,
};

console.log(JSON.stringify(obj,(k,v) => v === undefined ? 'undefined' : v ));
// {"a":"undefined","b":"bbb","c":"undefined","d":"ccc","e":"undefined"}

bigint

ちなみに、bigint型を使用した場合はエラーが発生します。

JSON.stringify({a: 10n});
// Uncaught TypeError: Do not know how to serialize a BigInt