Thứ tự của các phần tử trong danh sách JSON có được giữ nguyên không?


254

Tôi đã nhận thấy thứ tự các phần tử trong một đối tượng JSON không phải là thứ tự ban đầu.

Còn các yếu tố của danh sách JSON thì sao? Là thứ tự của họ được duy trì?

Câu trả lời:


370

Có, thứ tự các phần tử trong mảng JSON được giữ nguyên. Từ RFC 7159 - Định dạng trao đổi dữ liệu ký hiệu đối tượng JavaScript (JSON) (nhấn mạnh của tôi):

Một đối tượng là một tập hợp không có thứ tự gồm các cặp tên / giá trị 0 hoặc nhiều hơn, trong đó 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à một lệnh chuỗi các zero hoặc nhiều giá trị.

Các thuật ngữ "đối tượng" và "mảng" xuất phát từ các quy ước của JavaScript.

Một số triển khai cũng bảo vệ thứ tự của các đối tượng JSON, nhưng điều này không được đảm bảo.


Tuy nhiên, tôi đã nói chuyện với một số nhà phát triển đã gặp phải vấn đề trong đó mảng KHÔNG được đặt hàng. Hãy xem đoạn văn có từ kỳ quặc này trong ecma-i Intl.org/publications/files/ECMA-ST/ECMA-404.pdf 'Cú pháp JSON không xác định bất kỳ ý nghĩa cụ thể nào đối với việc sắp xếp các giá trị. Tuy nhiên, cấu trúc mảng JSON thường được sử dụng trong các tình huống có một số ngữ nghĩa để đặt hàng. '
Cato

74

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


7

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

Kịch bản sau đây sẽ xuất ra "Một", "Hai", "Ba":

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

Trong khi đó đoạn script sau sẽ xuất ra "Ba", "Một", "Hai":

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

16
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ó hành vi tương tự.
Licks nóng

3
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, chỉ có thể được suy ra thành mảng có nghĩa, được sắp xếp theo ngữ nghĩa theo đặc tả của json (xem câu trả lời của Jeremy).
Tom

5

Một số công cụ JavaScript giữ các khóa theo thứ tự chèn. Ví dụ, V8 giữ tất cả các khóa theo thứ tự chèn ngoại trừ các khóa có thể được phân tích cú pháp dưới dạng số nguyên 32 bit không dấu .

Điều này có nghĩa là nếu bạn chạy một trong các cách sau:

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ẽ liên tục nhận được chó , gấukhỉ theo thứ tự đó, trên Chrome, sử dụng động cơ V8. Node.js cũng sử dụng động cơ V8. Điều này sẽ đúng ngay cả khi bạn có hàng ngàn mặt hàng. YMMV với các công cụ JavaScript khác.

Demo ở đâyđây .


7
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ó hành vi tương tự.
Hot Licks

1

"Thứ tự của 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 hỏi "Thứ tự của các thành phần 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 đột biến 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ó lẽ bạn đang nói về các hoạt động như thế nào 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% * trình phân tích cú pháp JSON không duy trì thứ tự các đối tượng và duy trì thứ tự các mảng, nhưng bạn cũng có thể sử dụng JSON để lưu trữ thứ gì đó như

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

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

* có lẽ còn hơn thế nữa :)


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ì trật tự và tôi đoán là một mình nó chiếm hơn 1% lượng sử dụng trình phân tích cú pháp JSON. code.google.com/p/v8/issues/detail?id=164#c1
Benjamin Atkin

3
@BenAtkin Thật buồn cười khi liên kết của bạn chỉ ra lời giải thích về cách V8 không duy trì trật tự.
dùng123444555621

2
"Tiêu chuẩn thực tế là khớp với thứ tự chèn, mà V8 cũng có, nhưng với một ngoại lệ"
Benjamin Atkin

14
Tất cả con người là nam giới, nhưng có một ngoại lệ: Phụ nữ là nữ.
dùng123444555621
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.