JSON字符串化一个Set

时间:2015-07-02 17:22:06

标签: javascript json ecmascript-6

如何JSON.stringify() Set

在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"]"

3 个答案:

答案 0 :(得分:61)

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()));

答案 1 :(得分:12)

使用此JSON.stringify替换程序:

(因为 toJSON是遗留工件,更好的方法是使用自定义replacer ,请参阅https://github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16

function Set_toJSON(key, value) {
  if (typeof value === 'object' && value instanceof Set) {
    return [...value];
  }
  return value;
}

然后:

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

结果:

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

答案 2 :(得分:4)

在完成上述所有工作的同时,我建议您对子类进行子类化并添加toJSON方法,以确保正确地进行字符串化。特别是如果你要经常进行字符串化。我在Redux商店中使用套装,需要确保这不是问题。

这是一个基本的实现。命名只是为了说明自己的风格。

class JSONSet extends Set {
    toJSON () {
        return [...this]
    }
}

const set = new JSONSet([1, 2, 3])
console.log(JSON.stringify(set))