JSON에서 집합을 나타내는 방법은 무엇입니까?


16

JSON은 스칼라, 배열 / 목록 및 맵과 같은 데이터 구조 (Java 동등 항목)를 지원합니다.

SetJSON에서는 A 가 기본적으로 지원되지 않습니다.

JSON에서 집합을 나타내는 여러 가지 방법에 대해 생각했습니다.

[1]-목록으로

그러나, 목록, 자신의 순서가 다음과 같은 두 가지 목록 때문에, ["a", "b"]그리고 ["b", "a"]목록으로 동일하지 않습니다,하지만 그들은 세트로 동일해야합니다.

[2]-지도

맵의 키 세트를 사용하고 값을 무시하십시오.

그러나 표준 비교를 사용하면 두 가지가 맵과 동일하지 않습니다

{"a": "foo", "b": "bar"}, {"a": null, "b": null}

[3]-특별한 가치가있는지도

스칼라를 사용 0하거나 말하고 null맵의 모든 키 값으로 강제 설정하십시오.

{"a": 0, "b": 0}

이렇게하면 표준 비교 도구에서 키 순서가 변경 되더라도 개체가 동일합니다.

그러나이 기술은 JSON 문서를 관련없는 데이터로 오염시킵니다.

[4]-주문 목록

첫 번째 제안으로 돌아가지만 이번에는 주문 목록으로 제공합니다. 이런 종류의 비교 문제를 해결합니다.

그러나 정렬의 복잡성을 염두에 두어야하며, 정렬 된 목록은 그렇지 않지만 맵 표기법은 중복을 처리합니다. 예:

{"a": 400, "a": 9}로 처리 {"a": 9}되지만 ["g", "g"]항상입니다 ["g", "g"].

모든 것을 말하면, 목록 표기법이 더 분명한 것처럼 보이지만 맵 표기법은 키 복제에 더 강력하고 특별한 가치에 대해 일관성을 유지하기가 어렵습니다 ( null좋은 선택 인 것처럼 보이지만).

어떻게 생각해? JSON에서 세트를 어떻게 표현 하시겠습니까?

추신

질문은 단지 JSON에 관한 것입니다. yaml과 같은 다른 형식도 사용할 수 있습니다. 아직도...


1
세트는 JSON에서 지원되지 않으며 범위를 벗어납니다. 세트 또는 고유하고 고유 한 콜렉션은 애플리케이션 범위 내에 있습니다. 컬렉션이기 때문에 컬렉션 구문을 사용하는 것이 더 분명합니다.
Zymus

1
왜 JSON으로 세트를 표현하고 싶습니까? JSON은 교환 형식임을 기억하십시오.
Andres F.

@AndresF. 값의 고유성 속성을 표현하는 것이 좋은 생각이라고 생각했습니다. JSON을 교환 형식으로 묶지 않을 것입니다. MongoDB와 같이 문서 저장에도 유용 할 수 있습니다.
Ron Klein

@RonKlein Fair로 충분합니다. 하지만 우 ... MongoDB로 시작하지 마라 : P
Andres F.

YAML에서 세트는 옵션 [3]으로 표시되지만 JSON에는없는 특수 표기법이 있습니다.
Jasmijn

답변:


21

글쎄, 당신은 할 수 없습니다. 말했듯이 배열과 사전을 나타낼 수 있습니다. 두 가지 선택이 있습니다.

집합을 배열로 나타냅니다. 장점 : 집합에서 배열로 또는 뒤로 변환하는 것이 일반적으로 쉽습니다. 단점 : 배열은 순서가 암시 적이므로 세트는 그렇지 않으므로 동일한 세트를 JSON 배열로 변환하면 다른 것으로 간주되는 배열을 만들 수 있습니다. 배열 요소를 고유하게 강제 할 수있는 방법이 없으므로 JSON 배열에 유효한 세트가 포함되어 있지 않을 수도 있습니다 (분명히 중복을 무시할 수 있습니다. 어쨌든 일어날 가능성이 있습니다).

키당 임의의 값 (예 : 0 또는 null)으로 사전을 세트로 나타냅니다. 값을 무시하면 완벽하게 일치합니다. 반면, 사전의 키를 세트로 추출하거나 세트를 사전으로 변환하기위한 라이브러리 지원이 없을 수 있습니다.

내 프로그래밍 환경에서 세트와 배열 사이의 변환이 더 쉽습니다 (설정하기 위해 배열은 중복 값을 잃어 버릴 수 없습니다. 그렇지 않아야하거나 올바른 것으로 간주됩니다). 그러나 그것은 매우 의견의 문제입니다.

그러나 언급되지 않은 방에 큰 뚱뚱한 코끼리가 있습니다. JSON 사전의 키는 문자열 만 될 수 있습니다. 집합이 문자열 집합이 아닌 경우 배열을 사용할 수 있습니다.


5
문자열이 아닌 경우는 사전에 대한 좋은 주장입니다.
Ron Klein

4

JSON으로 세트를 나타내려고하지 마십시오. 대신 데이터를 구문 분석 할 때 수행하십시오.

JSON 데이터에는 어떤 필드를 집합으로 취급해야하는지 지정하는 스키마가 있거나 목록을 집합 (예 :) {"houses": {"_type": "set", "value": [...]}}또는 명명 규칙 으로 취급해야하는시기를 설명하는 메타 데이터가 JSON 데이터 자체에 포함되어있을 수 있습니다 .

JSON 표준에 따라 JSON 객체에는 중복 키가있을 수 있습니다. ECMA-404 문구 :

사물

[...] JSON 구문은 이름으로 사용되는 문자열에 제한을 두지 않으며 이름 문자열을 고유하게 요구하지 않으며 이름 / 값 쌍의 순서에 의미를 부여하지 않습니다. 이는 JSON 프로세서 또는 데이터 교환을위한 JSON의 특정 용도를 정의하는 사양에서 정의 할 수있는 의미 론적 고려 사항입니다.

AFAICD, 사양에는 고유하지 않은 이름을 금지하는 것이 없으며 고유하지 않은 객체 이름을 구문 분석 할 수있는 많은 JSON 파서 구현이 있습니다. RFC 7159는 상호 운용성을 위해 고유하지 않은 이름을 사용하지 말고 특별히 금지하지는 않으며, 고유하지 않은 오브젝트 이름을 처리하는 다양한 구문 분석기가 표시되는 방법을 나열합니다.

또한 ECMA 404는 어레이 순서를 유지하지 않아도됩니다.

배열

JSON 구문은 값 순서에 특정한 의미를 정의하지 않습니다. 그러나 JSON 배열 구조는 순서에 의미가있는 경우에 자주 사용됩니다.

이 문구를 사용하면 응용 프로그램에서 배열을 사용하여 원하는 경우 집합을 나타낼 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.