2011-08-27 25 views
157

Tôi đã nhận thấy thứ tự các phần tử trong đối tượng JSON không phải là thứ tự ban đầu.Thứ tự của các phần tử trong danh sách JSON có được giữ nguyên không?

Còn các yếu tố trong danh sách JSON thì sao? Đơn đặt hàng của họ có được duy trì không?

+3

Bạn phải cụ thể hơn. JSON là một định dạng trao đổi dữ liệu và về cơ bản là ** văn bản **. Các nhân vật không tự ý thay đổi vị trí của họ. Bạn sẽ nhận được nó giống như cách bạn gửi nó. –

+1

Tôi sẽ hướng mọi người đến cú pháp JSON chính thức tại json.org. JSON không có "danh sách". Nó có "mảng" và "đối tượng". –

Trả lời

248

Có, thứ tự của các phần tử trong mảng JSON được giữ nguyên. Từ RFC 7159 -The JavaScript Object Notation (JSON) Data Interchange Format (tôi nhấn mạnh):

Một đối tượng là một bộ sưu tập có thứ tự của zero hoặc nhiều tên/giá trị cặp, trong đó một tên là một chuỗi và một giá trị là một chuỗi, số, boolean, null , đối tượng hoặc mảng.

Một mảng là đã ra lệnh chuỗi không có hoặc nhiều giá trị.

Thuật ngữ "đối tượng" và "mảng" đến từ các quy ước của JavaScript.

44

Thứ tự của các phần tử trong mảng ([]) được duy trì. Thứ tự của các phần tử (tên: cặp giá trị) trong một "đối tượng" ({}) là không, và thông thường chúng bị "lộn xộn", nếu không phải bởi trình phân tích cú pháp/trình phân tích cú pháp JSON thì đối tượng cụ thể theo ngôn ngữ (Từ điển , NSDictionary, Hashtable, vv) được sử dụng như một biểu diễn bên trong.

3

"Thứ tự các phần tử trong danh sách JSON có được duy trì không?" không phải là một câu hỏi hay. Bạn cần phải hỏi "Thứ tự các phần tử trong danh sách JSON có được duy trì khi thực hiện [...] không?" Như Felix King đã chỉ ra, JSON là một định dạng dữ liệu văn bản. Nó không biến đổi mà không có lý do. Đừng nhầm lẫn một chuỗi JSON với một đối tượng (JavaScript).

Có thể bạn đang nói về các hoạt động như JSON.stringify(JSON.parse(...)). Bây giờ câu trả lời là: Nó phụ thuộc vào việc thực hiện. 99% * parsers JSON không duy trì trật tự của các đối tượng, và làm duy trì trật tự của mảng, nhưng bạn cũng có thể sử dụng JSON để lưu trữ một cái gì đó giống như

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

và sử dụng một cú pháp duy trì trật tự của các đối tượng.

* có lẽ thậm chí nhiều hơn :)

+1

Sai, ít nhất là nếu bạn đang nói về việc sử dụng trình phân tích cú pháp JSON. V8 duy trì thứ tự, và tôi đoán là nó chỉ chiếm hơn 1% việc sử dụng trình phân tích cú pháp JSON. http://code.google.com/p/v8/issues/detail?id=164#c1 –

+2

@BenAtkin Thật thú vị khi liên kết của bạn trỏ đến giải thích về cách V8 không ** không ** duy trì thứ tự. – user123444555621

+2

"Các tiêu chuẩn thực tế là để phù hợp với thứ tự chèn, mà V8 cũng làm, nhưng với một ngoại lệ" –

5

Một số công cụ JavaScript giữ phím để chèn. V8, ví dụ: keeps all keys in insertion order except for keys that can be parsed as unsigned 32-bit integers.

Điều này có nghĩa rằng nếu bạn chạy một trong hai điều sau đây:

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

Bạn sẽ luôn có được chó, gấu, và khỉ theo thứ tự đó, trên Chrome, trong đó sử dụng V8. Node.js cũng sử dụng V8. Điều này sẽ đúng ngay cả khi bạn có hàng ngàn mục. YMMV với các công cụ JavaScript khác.

Demo herehere.

+4

Nhưng đó là dựa vào hành vi không xác định trên một phần của JSON. Bất cứ điều gì bạn trao đổi với có thể không có cùng một hành vi. –

7

Thực tế, nếu các phím thuộc loại NaN, trình duyệt sẽ không thay đổi thứ tự.

Các kịch bản sau đây sẽ ra "One", "Hai", "Ba":

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

Trong khi kịch bản sau đây sẽ ra "Ba", "One", "Hai":

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

Nhưng đó là dựa vào hành vi không xác định trên một phần của JSON. Bất cứ điều gì bạn trao đổi với có thể không có cùng một hành vi. –

+0

Câu trả lời này thảo luận về một đối tượng. Câu hỏi liên quan đến "danh sách" json, mà chỉ có thể suy ra để có nghĩa là mảng, được đặt theo nghĩa ngữ nghĩa bởi đặc tả json (xem câu trả lời của Jeremy). – Tom

Các vấn đề liên quan