[javascript] JSON 문자열 화

하나의 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"]"



답변

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


답변

다음 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]}"


답변

위의 모든 작업이 수행되는 동안 하위 클래스를 설정하고 toJSONstringify가 올바르게 작동하는지 확인 하는 메서드를 추가하는 것이 좋습니다 . 특히 당신이 자주 끈을 묶을 것이라면. 저는 Redux 스토어에서 세트를 사용하고 이것이 문제가되지 않는지 확인해야했습니다.

이것은 기본 구현입니다. 네이밍은 자신의 스타일을 선택하는 포인트를 설명하기위한 것입니다.

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

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


답변