JSON 목록의 요소 순서가 유지됩니까?


254

JSON 객체의 요소 순서가 원래 순서가 아닌 것을 알았습니다.

JSON 목록의 요소는 어떻습니까? 순서가 유지됩니까?

답변:


370

예, JSON 배열의 요소 순서는 유지됩니다. 에서 RFC 7159 년 - 자바 스크립트 객체 표기법 (JSON) 데이터 교환 형식 (강조 광산) :

객체는 0 개 이상의 이름 / 값 쌍으로 정렬되지 않은 컬렉션입니다. 여기서 이름은 문자열이고 값은 문자열, 숫자, 부울, null, 객체 또는 배열입니다.

배열은 인 정렬 제로 이상의 값의 시퀀스.

"객체"와 "배열"이라는 용어는 JavaScript 규칙에서 비롯된 것입니다.

일부 구현은 JSON 객체의 순서도 유지하지만 이것이 보장되지는 않습니다.


그러나 배열을 주문하지 않은 문제가 발생한 일부 개발자에게 이야기했습니다. ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf 에서이 이상한 문구를 살펴보십시오. 'JSON 구문은 값 순서에 특정한 의미를 정의하지 않습니다. 그러나 JSON 배열 구조는 순서에 의미가있는 경우에 자주 사용됩니다. '
Cato

74

배열 ( []) 의 요소 순서 가 유지됩니다. "객체"( {}) 의 요소 순서 (이름 : 값 쌍)는 그렇지 않으며 JSON 포맷터 / 파서 자체가 아니라 언어 별 객체 (사전, 내부 표현으로 사용되는 NSDictionary, Hashtable 등).


7

실제로, 키가 NaN 유형 인 경우 브라우저는 순서를 변경하지 않습니다.

다음 스크립트는 "One", "Two", "Three"를 출력합니다.

var foo={"3":"Three", "1":"One", "2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}

다음 스크립트는 "Three", "One", "Two"를 출력합니다.

var foo={"@3":"Three", "@1":"One", "@2":"Two"};
for(bar in foo) {
    alert(foo[bar]);
}

16
그러나 이것은 JSON 부분에서 정의되지 않은 동작에 의존합니다. 당신이 교류하는 것은 똑같은 행동을하지 않을 수도 있습니다.
핫 릭

3
이 답변은 객체에 대해 설명합니다. 질문은 json 사양에 따라 의미 적으로 정렬되는 배열을 의미하는 것으로 유추 할 수있는 json "list"와 관련됩니다 (Jeremy의 답변 참조).
Tom

5

일부 JavaScript 엔진은 키를 삽입 순서대로 유지합니다. 예를 들어, V8 은 부호없는 32 비트 정수로 구문 분석 할 수있는 키를 제외한 모든 키를 삽입 순서대로 유지합니다 .

즉, 다음 중 하나를 실행하면

var animals = {};
animals['dog'] = true;
animals['bear'] = true;
animals['monkey'] = true;
for (var animal in animals) {
  if (animals.hasOwnProperty(animal)) {
    $('<li>').text(animal).appendTo('#animals');
  }
}
var animals = JSON.parse('{ "dog": true, "bear": true, "monkey": true }');
for (var animal in animals) {
  $('<li>').text(animal).appendTo('#animals');
}

Chrome에서 V8을 사용하는 dog , bear , monkey 를 일관된 순서로 얻을 수 있습니다. Node.js는 V8도 사용합니다. 수천 개의 항목이 있어도 마찬가지입니다. 다른 JavaScript 엔진과 YMMV

여기여기에 데모가 있습니다 .


7
그러나 이것은 JSON 부분에서 정의되지 않은 동작에 의존합니다. 당신이 교류하는 것은 똑같은 행동을하지 않을 수도 있습니다.
핫 릭

1

"JSON 목록의 요소 순서가 유지됩니까?" 좋은 질문이 아닙니다. "[...]을 수행 할 때 JSON 목록의 요소 순서가 유지됩니까?" Felix King이 지적했듯이 JSON은 텍스트 데이터 형식입니다. 이유없이 변경되지 않습니다. JSON 문자열을 (JavaScript) 객체와 혼동하지 마십시오.

아마도 같은 작업에 대해 이야기하고 있습니다 JSON.stringify(JSON.parse(...)). 이제 답은 : 구현에 달려 있습니다. JSON 파서의 99 % *는 객체의 순서를 유지하지 않고 배열의 순서를 유지하지만 JSON을 사용하여 다음과 같은 것을 저장할 수 있습니다.

{
    "son": "David",
    "daughter": "Julia",
    "son": "Tom",
    "daughter": "Clara"
}

객체의 순서를 유지하는 파서를 사용하십시오.

* 아마도 훨씬 더 :)


1
적어도 JSON 파서 사용법에 대해 이야기하고 있다면 잘못되었습니다. V8은 순서를 유지하며 JSON 파서 사용량의 1 % 이상을 차지한다고 생각합니다. code.google.com/p/v8/issues/detail?id=164#c1
Benjamin Atkin

3
@BenAtkin 링크가 V8이 순서를 유지 하지 않는 방법에 대한 설명을 가리키는 것은 재미 있습니다 .
user123444555621

2
"실제로 표준은 V8과 마찬가지로 삽입 순서를 일치시키는 것이지만 한 가지 예외가 있습니다"
Benjamin Atkin

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