Lý do thực sự về lý do tại sao các khóa JSON nên nằm trong dấu ngoặc kép, dựa vào ngữ nghĩa của Số nhận dạng của ECMAScript 3.
Không thể sử dụng các từ dành riêng làm tên thuộc tính trong Object Literals mà không có dấu ngoặc kép, ví dụ:
({function: 0})
({if: 0})
({true: 0})
Trong khi nếu bạn sử dụng dấu ngoặc kép, tên thuộc tính là hợp lệ:
({"function": 0})
({"if": 0})
({"true": 0})
Crockford riêng giải thích điều đó trong buổi nói chuyện này , họ muốn giữ cho tiêu chuẩn JSON đơn giản và họ sẽ không muốn có tất cả những hạn chế ngữ nghĩa đó đối với nó:
....
Đó là khi chúng tôi phát hiện ra vấn đề tên không được trích dẫn. Hóa ra ECMA Script 3 có chính sách từ dành riêng. Những từ dành riêng phải được trích dẫn ở vị trí then chốt, điều này thực sự gây phiền toái. Khi tôi bắt đầu xây dựng điều này thành một tiêu chuẩn, tôi không muốn phải đưa tất cả các từ dành riêng vào tiêu chuẩn, bởi vì nó trông thực sự ngu ngốc.
Vào thời điểm đó, tôi đang cố gắng thuyết phục mọi người: vâng, bạn có thể viết ứng dụng bằng JavaScript, nó thực sự sẽ hoạt động và đó là một ngôn ngữ tốt. Sau đó, tôi không muốn nói: và hãy nhìn vào điều thực sự ngu ngốc mà họ đã làm! Vì vậy, tôi quyết định, thay vào đó, hãy chỉ trích dẫn các phím.
Bằng cách đó, chúng tôi không cần phải nói với bất kỳ ai về nó như thế nào.
Đó là lý do tại sao, cho đến ngày nay, các khóa được trích dẫn trong JSON.
...
Tiêu chuẩn ECMAScript phiên bản thứ 5 khắc phục điều này, giờ đây trong bản triển khai ES5, ngay cả các từ dành riêng cũng có thể được sử dụng mà không cần dấu ngoặc kép, trong cả ký tự đối tượng và quyền truy cập thành viên ( obj.function
Ok trong ES5).
Chỉ đối với hồ sơ, tiêu chuẩn này đang được các nhà cung cấp phần mềm triển khai những ngày này, bạn có thể xem những trình duyệt nào bao gồm tính năng này trên bảng tương thích này (xem Các từ dành riêng làm tên thuộc tính )