Có lý do thực tế nào để sử dụng các chuỗi được trích dẫn cho các khóa JSON không?


87

Theo json.org của Crockford , một đối tượng JSON được tạo thành từ các thành viên , được tạo thành từ các cặp .

Mọi cặp được tạo bởi một chuỗi và một giá trị , với một chuỗi được định nghĩa là:

Chuỗi là một chuỗi không hoặc nhiều ký tự Unicode, được đặt trong dấu ngoặc kép, sử dụng dấu gạch chéo ngược thoát ra. Một ký tự được biểu diễn dưới dạng một chuỗi ký tự. Một chuỗi rất giống một chuỗi C hoặc Java.

Nhưng trong thực tế, hầu hết các lập trình viên thậm chí không biết rằng một khóa JSON nên được bao quanh bởi dấu ngoặc kép, vì hầu hết các trình duyệt không yêu cầu sử dụng dấu ngoặc kép.

Có bất kỳ ý nghĩa nào khi bận tâm xung quanh JSON của bạn trong dấu ngoặc kép?

Ví dụ hợp lệ:

{
  "keyName" : 34
}

Trái ngược với không hợp lệ:

{
   keyName : 34
}

20
"Tại sao phải bận tâm làm đúng?" Đây là kiểu suy nghĩ lười biếng dẫn đến các trang web chứa đầy đánh dấu không hợp lệ. Tương lai chứng minh mã của bạn trong trường hợp một số trình duyệt không cần dấu ngoặc kép.
Meagar

21
"Tại sao phải bận tâm làm đúng?" - Tại sao phải tuân theo một quy ước mà không ai khác làm, nếu không có lợi ích thực sự? Có lẽ bạn nhầm lẫn giữa suy nghĩ lười biếng với chủ nghĩa thực dụng.
Mark Rogers

15
@Mark - "điều đó không ai khác làm" ... bạn lấy ý tưởng đó từ đâu? trình tuần tự JSON được tích hợp trong mọi nền tảng chính thực hiện trích dẫn phù hợp.
Nick Craver

7
@Mark Rogers Hàm json_encode trong PHP tạo ra JSON hợp lệ, ví dụ: với các chuỗi được trích dẫn kép. Có thể bạn đang nghĩ đến các ký tự đối tượng trong JavaScript? Đúng là những thứ đó hoạt động mà không cần trích dẫn các khóa, nhưng đó không phải là JSON.
JAL

9
Đối với hồ sơ, nhiều năm trước khi tôi đăng bài này, tôi đã nhầm lẫn về sự khác biệt giữa JSON và ký hiệu chữ đối tượng như @JAL đề xuất. Cả hai có một cú pháp rất giống nhau, điều này cuối cùng dẫn đến một số nhầm lẫn trong việc mô tả vấn đề.
Mark Rogers

Câu trả lời:


155

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}) // SyntaxError
({if: 0}) // SyntaxError
({true: 0}) // SyntaxError
// etc...

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}) // Ok
({"if": 0}) // Ok
({"true": 0}) // Ok

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.functionOk 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 )


1
@Mark, bạn được chào đón. Hãy nhớ rằng JSON chỉ đơn giản là một định dạng trao đổi dữ liệu bất khả tri về ngôn ngữ , ngay cả khi cú pháp của nó được lấy cảm hứng từ cú pháp Javascript Object Literal, thì giữa chúng có sự khác biệt (nhiều hơn chỉ là các khóa được trích dẫn).
Christian C. Salvadó

2
@CMS, Vậy tại sao nó chỉ có dấu ngoặc kép? Tại sao các dấu ngoặc kép không hợp lệ trong JSON?
Pacerier

1
Các dấu ngoặc kép không được phép để giữ cho tiêu chuẩn JSON càng đơn giản càng tốt. JSON chỉ cần là một tập con của Javascript, nó không cần triển khai càng nhiều Javascript càng tốt.
thomasrutter

Các JSON5 superset đặc tả tuân thủ cú pháp ES5 và do đó hỗ trợ các phím không thể viện chứng giữa những thứ khác. Thư viện có các phương pháp parsevà tương thích stringify.
Inigo

Trong liên kết bảng tương thích đó (ở cuối câu trả lời), mục nhập Các từ dành riêng nằm trong phần Mở rộng theo nghĩa đen đối tượng / mảng . Và TL; DR, tất cả các trình duyệt được liệt kê (tất cả những gì bạn đã nghe nói đến và khoảng 20 trình duyệt khác) đều nói "Có".
i336_

16

Có, đó là JSON không hợp lệ và sẽ bị từ chối nếu không trong nhiều trường hợp, ví dụ: jQuery 1.4+ có dấu kiểm khiến JSON chưa được trích dẫn âm thầm không thành công. Tại sao không tuân thủ?

Hãy lấy một ví dụ khác:

{ myKey: "value" }
{ my-Key: "value" }
{ my-Key[]: "value" }

... tất cả những điều này sẽ hợp lệ với dấu ngoặc kép, tại sao không nhất quán và sử dụng chúng trong mọi trường hợp, loại bỏ khả năng xảy ra sự cố?

Một ví dụ phổ biến nữa trong thế giới nhà phát triển web: Có hàng ngàn ví dụ về HTML không hợp lệ hiển thị trong hầu hết các trình duyệt ... điều đó có giúp gỡ lỗi hoặc bảo trì ít khó khăn hơn không? Không hề, hoàn toàn ngược lại.

Ngoài ra, @ Matthew cũng đưa ra điểm tốt nhất trong các nhận xét bên dưới, điều này đã không thành công, các khóa chưa được trích dẫn sẽ gây ra lỗi cú pháp JSON.parse()trong tất cả các trình duyệt chính (và bất kỳ trình duyệt nào khác triển khai đúng), bạn có thể kiểm tra nó tại đây .


Vâng, tôi đã có một số ứng dụng ajax cũ tạo ra phía máy chủ json schonky, lỗi này không thành công khi nâng cấp lên jquery 1.4 do thiếu dấu ngoặc kép xung quanh các tên khóa.
JAL

Bạn có thể muốn thêm rằng tất cả các trình duyệt chính ' JSON.parsecũng sẽ từ chối nó một cách chính xác.
Matthew Flaschen

Tôi tò mò, chính xác thì JQuery 1.4 sẽ không thành công với loại json không hợp lệ này trong trường hợp nào?
Mark Rogers

1
@Mark - Trong mọi trường hợp, nó không được trích dẫn chính xác hoặc có các ký tự không hợp lệ ... về cơ bản nó sẽ không thành công với bất kỳ JSON không hợp lệ nào.
Nick Craver

Điều đó thật thú vị, đó không phải là trải nghiệm của tôi với JQuery 1.4. Hơn nữa, tôi không nghĩ rằng jquery chịu trách nhiệm tạo các đối tượng json, đó không phải là những gì trình thông dịch javascript của trình duyệt làm? Bạn đang đề cập đến Jquery json deserialization?
Mark Rogers

-4

YAML, trên thực tế là một tập hợp JSON, hỗ trợ những gì bạn muốn làm. Mặc dù nó là một superset, nó cho phép bạn giữ nó đơn giản như bạn muốn.

YAML là một luồng không khí trong lành và có thể đáng để bạn dành thời gian để xem qua. Nơi tốt nhất để bắt đầu là tại đây: http://en.wikipedia.org/wiki/YAML

Có lib cho mọi ngôn ngữ, bao gồm cả JS, ví dụ: https://github.com/nodeca/js-yaml


11
YAML không phải là một tập hợp lớn của JSON.
John Gibb

để biết thông tin về lý do: stackoverflow.com/questions/25974485/…
Ben Trang
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.