2012-02-16 32 views
7

Tại sao JSON chỉ cho phép string là chìa khóa của một cặp? Tại sao không phải các loại khác như null, number, bool, object, array? Xem xét JSON có liên quan chặt chẽ với JavaScript, tôi có thể kết luận lý do từ đặc tả JavaScript (ECMA-262) không? Tôi hoàn toàn là một newbie để JavaScript, bạn có thể giúp tôi chỉ ra nó.Tại sao JSON chỉ cho phép chuỗi là khóa?

+2

Tôi sẽ không nói JSON là một phần của JavaScript. Các cấu trúc dữ liệu của nó dựa trên các ký hiệu dạng mảng và đối tượng được tìm thấy trong JavaScript, nhưng sự tồn tại của nó độc lập với ECMA-262. –

Trả lời

1

Vì đó là cách ghi rõ đặc điểm kỹ thuật.

+2

Sau đó, tại sao nó được viết như vậy. Tất cả mọi thứ đi kèm với một lý do. –

+1

@paladin_t - Không nhất thiết. Đôi khi nó chỉ là sở thích của nhà văn. –

+0

@Hot Licks, điều đó là hợp lý. –

6

Định dạng JSON là cố tình dựa trên một tập hợp con cú pháp ngữ pháp đối tượng JavaScript và cú pháp chữ mảng, và đối tượng JavaScript chỉ có thể có chuỗi là khóa - do đó, khóa JSON cũng là chuỗi. (OK, bạn có thể sắp xếp sử dụng các số như các khóa đối tượng JavaScript, nhưng thực sự chúng được chuyển thành các chuỗi.)

Lưu ý rằng điểm JSON là biểu diễn chuỗi dữ liệu để cho phép trao đổi dễ dàng giữa các chương trình được viết bằng các ngôn ngữ khác nhau chạy trên các máy khác nhau trong các môi trường khác nhau. Nếu bạn muốn sử dụng một đối tượng như một chìa khóa thì đối tượng đó sẽ lần lượt phải được biểu diễn bằng một chuỗi để truyền, nhưng sau đó ngôn ngữ nhận sẽ cần có khả năng sử dụng các đối tượng làm khóa và điều đó có nghĩa là bạn cần một tập con giới hạn của JSON cho những ngôn ngữ đó sẽ chỉ là một mớ hỗn độn.

"Xét JSON là một phần của JavaScript"

Không, nó không phải là. Các trình duyệt mới hơn cung cấp các phương thức để tạo và phân tích cú pháp JSON, nhưng chúng không phải là một phần của ngôn ngữ như vậy ngoại trừ JSON là một định dạng chuỗi và JavaScript có thể làm các chuỗi. JSON là luôn là một biểu diễn chuỗi - nó phải được phân tích cú pháp để tạo đối tượng để sử dụng trong JavaScript (hoặc các ngôn ngữ khác) và một khi điều đó xảy ra JavaScript (hoặc các ngôn ngữ khác) xử lý đối tượng kết quả giống như bất kỳ đối tượng nào khác.

(Cũng lưu ý rằng một chút đặc biệt của JSON không nhất thiết phải có bất kỳ phím nào cả:. Nó chỉ có thể là một mảng, như '["one","two","three"]')

+0

Chuỗi gần như được hỗ trợ trực tiếp bằng các ngôn ngữ khác nhau, nhưng đối tượng phải là một tùy chỉnh. Chúng ta phải làm một cái gì đó để đối phó với đối tượng từ giá trị, đó có thể là cùng một cách cho chìa khóa. Nếu chúng tôi đã hạn chế quan trọng chỉ có thể là một chuỗi vì vượt qua sự trao đổi ngôn ngữ dễ dàng, sau đó đó là để nói rằng giá trị được giới hạn như vậy quá. Tôi muốn xem xét nó phó trong JavaScript. –

+1

JSON được thiết kế để trao đổi _data_. Nếu dữ liệu của ứng dụng của bạn quá phức tạp đến mức bạn không thể tìm thấy cách để đại diện cho nó bằng cách sử dụng các tên khóa dựa trên chuỗi, thì tôi khuyên bạn nên làm mọi thứ quá khó cho bản thân. Nếu bạn cảm thấy bạn phải có các đối tượng như khóa thì bạn có thể làm điều đó trong JSON bằng cách bao gồm một đối tượng 'keys' (' lồng nhau) 'ánh xạ các tên thuộc tính dựa trên chuỗi cho các đối tượng để các đối tượng đó trở thành" các khóa ảo ". Câu trả lời cho câu hỏi ban đầu của bạn, "Tại sao chỉ có chuỗi?" là vì đó là tất cả những gì cần thiết cho mục đích của JSON và đó là những gì mà nhà thiết kế gốc đã giải quyết. – nnnnnn

1

Lý do chính theo người phát hiện JSON đại diện là, "trong khi phân tích json dữ liệu, có một cơ hội/khả năng rằng, key bạn đang sử dụng để tham khảo một value có thể là một reserved word trong ngôn ngữ phân tích cú pháp của bạn"

tham khảo talk này bởi Douglas Crockford, là người khám phá ra JSON r epresentation.

Ví dụ: { id: 1234, name: "foo", do: "somthing" }

Kể từ khi JSON là một khả năng tương thích ngôn ngữ chéo chúng ta có thể sử dụng tập dữ liệu này trong nhiều ngôn ngữ. Tuy nhiên, từ do là từ khóa trong Javascript. Nó sẽ kết thúc trong lỗi cú pháp trong khi phân tích cú pháp.

+0

mặc dù hầu hết các ngôn ngữ lập trình sẽ không sử dụng các số làm khóa, nhưng các số không được phép. –

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