JSON 문자열 화


102

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

답변:


108

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
제안하려고 했어요 Array.from(). 그러나 이것은 관용적으로 더 좋아 보입니다.
TaoPR

3
몇 가지 참조를 추가하기 위해 MDN 에는이 기술과 기타 관련 기술에 대한 몇 가지 예가 있습니다.
Amit

5
목록 이해도 작동 할 수 있습니다.JSON.stringify([_ for (_ of s)])
Whymarrh 2015-07-02

1
모든 훌륭한 방법은 슬프게도 스프레드와 Array.from이 아직 구현되지 않았기 때문에 Chromium 43에서 즉시 작동하지 않습니다. 구조에 바벨처럼 보입니다.
MitMaro

2
현재 제안의 기본 개선하기 Set.prototype.toJSON: github.com/DavidBruant/Map-Set.prototype.toJSON
Oncle 톰

34

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

5
ES6에 단축 버전이 있습니다JSON.stringify(fooBar, (key, value) => value instanceof Set ? [...value] : value)
OzzyCzech

해당 리바이 버는 독자를위한 연습 문제로 남겨져 있습니까? ;-)
Robert Siemer

7

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

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

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

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

4
toJSON레거시 기능으로 간주되는 이 접근 방식은 권장하지 않습니다 . 제안서는 추가 toJSON모두 setmap거부 : github.com/DavidBruant/Map-Set.prototype.toJSON/issues/16
MitMaro에게

재정의 constructor가 필요하지 않습니다.
저스틴 존슨
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.