2011-08-27 6 views
157

원래 주문이 아닌 JSON 객체의 요소 순서를 확인했습니다.JSON 목록의 요소 순서가 유지됩니까?

JSON 목록의 요소는 어떻게됩니까? 그들의 명령은 유지되고 있습니까?

+3

더 구체적이어야합니다. JSON은 데이터 교환 형식이며 기본적으로 ** 텍스트 **입니다. 캐릭터의 위치가 임의로 변경되는 것은 아닙니다. 당신이 보낸 것과 같은 방식으로 그것을 받게됩니다. –

+1

json.org의 공식 JSON 구문으로 안내 할 것입니다. JSON에는 "목록"이 없습니다. 그것에는 "배열"과 "객체"가 있습니다. –

답변

248

예, JSON 배열의 요소 순서는 유지됩니다. RFC 7159 -The JavaScript Object Notation (JSON) Data Interchange Format 가입일 (강조 광산)

객체는 0 개 이상의 이름/값 쌍 순서화 컬렉션 이름 문자열이고, 값은 문자열, 숫자, 부울 널이다 , 객체 또는 배열.

배열은 이며 0보다 큰 값을 갖는 시퀀스로되어 있습니다.

"개체"및 "배열"이라는 용어는 JavaScript의 규칙에 따라 작성되었습니다.

44

배열의 요소 순서 ([])가 유지됩니다. "객체"({})에서 요소의 순서 (이름 : 값 쌍)는 아닙니다. JSON 포맷터/파서 자체가 아니라 언어 별 객체 (사전)를 사용하면 "뒤죽박죽"일 수 있습니다. , NSDictionary, Hashtable 등)를 내부 표현으로 사용합니다.

3

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

아마 당신은 JSON.stringify(JSON.parse(...))과 같은 작업에 대해 이야기하고있을 것입니다. 이제 대답은 : 그것은 구현에 달려 있습니다. JSON 파서의 99 % * 객체의 순서를 유지하고 배열의 순서를 유지 할 수 있지만, 당신은뿐만 아니라

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

같은 것을 저장하고 객체의 순서를 유지하는 파서를 사용하여 JSON을 사용할 수 없습니다.

*이 아마 훨씬 더 :)

+1

적어도 JSON 파서 사용법에 대해 이야기하고 있다면 틀린 말입니다. V8은 주문을 유지하고 있으며 JSON 파서 사용량의 1 % 이상을 차지하고 있다고 생각합니다. http://code.google.com/p/v8/issues/detail?id=164#c1 –

+2

@BenAtkin 귀하의 링크가 V8의 ** ** ** 주문 유지 방법에 대한 설명을 가리키는 것은 재미 있습니다. – user123444555621

+2

"사실상 표준은 V8도 마찬가지이지만 한 가지 예외가 있습니다." –

5

일부 자바 스크립트 엔진은 삽입 순서로 키를 유지한다. V8 (예 : keeps all keys in insertion order except for keys that can be parsed as unsigned 32-bit integers).

는 다음 중 하나를 실행하면 것을 의미한다 :

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'); 
} 

당신은 지속적으로 크롬에 , , 그 순서 원숭이를 얻을 것이다하는 V8을 사용합니다. Node.js도 V8을 사용합니다. 수천 개의 항목이 있더라도 유지됩니다. 다른 자바 스크립트 엔진과 YMMV.

데모 herehere.

+4

하지만 JSON에서 정의되지 않은 동작에 의존합니다. 교환하는 내용이 모두 동일한 동작을하지 않을 수도 있습니다. –

7

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

다음 스크립트를 출력합니다 "하나", "2", "세"

var foo={"@3":"Three", "@1":"One", "@2":"Two"}; 
for(bar in foo) { 
    alert(foo[bar]); 
} 
: 다음 스크립트를 출력 "세", "하나", "2"반면

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

+11

하지만 JSON에서 정의되지 않은 동작에 의존합니다. 교환하는 내용이 모두 동일한 동작을하지 않을 수도 있습니다. –

+0

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

관련 문제