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ì?
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:
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.
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ộ.
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]);
}
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ấu và khỉ 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.
"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 :)