JSON 字符串化集

2022-08-30 03:01:44

一个JSON.stringify()如何成为一个集合

在Chromium 43中不起作用的事情:

var s = new Set(['foo', 'bar']);

JSON.stringify(s); // -> "{}"
JSON.stringify(s.values()); // -> "{}"
JSON.stringify(s.keys()); // -> "{}"

我希望得到类似于序列化数组的东西。

JSON.stringify(["foo", "bar"]); // -> "["foo","bar"]"

答案 1

JSON.stringify不直接使用集,因为存储在集中的数据不存储为属性。

但是您可以将集合转换为数组。然后,您将能够正确字符串化它。

以下任何一项都可以解决问题:

JSON.stringify([...s]);
JSON.stringify([...s.keys()]);
JSON.stringify([...s.values()]);
JSON.stringify(Array.from(s));
JSON.stringify(Array.from(s.keys()));
JSON.stringify(Array.from(s.values()));

答案 2

您可以将“replacer”函数传递给 JSON.stringify

const fooBar = {
  foo: new Set([1, 2, 3]),
  bar: new Set([4, 5, 6])
};

JSON.stringify(
  fooBar,
  (_key, value) => (value instanceof Set ? [...value] : value)
);

结果:

"{"foo":[1,2,3],"bar":[4,5,6]}"

toJSON 是一个遗留的工件,更好的方法是使用自定义替换器,请参阅 https://github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16