JSON stringify a Set

后端 未结 3 1900
难免孤独
难免孤独 2020-11-30 01:08

How would one JSON.stringify() a Set?

Things that did not work in Chromium 43:

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

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


        
相关标签:
3条回答
  • 2020-11-30 01:22

    JSON.stringify doesn't directly work with sets because the data stored in the set is not stored as properties.

    But you can convert the set to an array. Then you will be able to stringify it properly.

    Any of the following will do the trick:

    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()));
    
    0 讨论(0)
  • 2020-11-30 01:23

    While all of the above work I suggest that you subclass set and add a toJSON method to make sure that it stringify's correctly. Especially if you are going to be stringifying often. I use sets in my Redux stores and needed to make sure this was never a problem.

    This is a basic implementation. Naming is just to illustrate the point pick your own style.

    class JSONSet extends Set {
        toJSON () {
            return [...this]
        }
    }
    
    const set = new JSONSet([1, 2, 3])
    console.log(JSON.stringify(set))
    
    0 讨论(0)
  • 2020-11-30 01:32

    Use this JSON.stringify replacer:

    (because toJSON is a legacy artifact, and a better approach is to use a custom replacer, see 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;
    }
    

    Then:

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

    Result:

    "{"foo":[1,2,3],"bar":[4,5,6]}"
    
    0 讨论(0)
提交回复
热议问题