programing

JSON 문자열화

copyandpastes 2023. 3. 27. 22:03
반응형

JSON 문자열화

1개 JSON.stringify()는 어떻게 설정됩니까?

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

「리페이서」기능을 다음에 전달할 수 있습니다.

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 를 참조해 주세요.

위의 모든 작업을 수행하는 동안 서브클래스를 설정하고 추가하는 것이 좋습니다.toJSON스트링화가 올바른지 확인하는 방법.특히 당신이 자주 끈을 매는다면.저는 Redux 매장에서 세트를 사용하고 있으며, 이것이 문제가 되지 않는지 확인할 필요가 있었습니다.

이것은 기본적인 실장입니다.이름 짓기는 단지 자신의 스타일을 선택하는 포인트를 설명하기 위한 것입니다.

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

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

앞의 모든 접근법의 문제는 모두 집합을 배열로 변환한다는 것입니다. 이 배열에는 집합과 인덱스의 전체 포인트가 누락되어 있습니다.

대신 개체를 사용해야 합니다.다음 함수로 변환하거나 Set 대신 Object로 만듭니다.

const mySet = new Set(['hello', 'world']);
const myObj = {};
for (let value of mySet.values()) {
  myObj[value] = true;
}

그럼 사용하는 대신mySet.has('hello')하다myObj.hasOwnProperty('hello').

그런 다음 문제 없이 개체로 문자열화합니다.

메모: 다음 방법에서는 키뿐만 아니라 값도 저장해야 하므로 메모리를 더 많이 사용합니다.그러나 성능 면에서는 O(n)인 Array.includes()에 비해 O(1)이며 Set을 사용하는 포인트조차 놓치고 있습니다.

언급URL : https://stackoverflow.com/questions/31190885/json-stringify-a-set

반응형