2008-12-19 32 views
26

Cú pháp chính xác để tạo đối tượng trong javascript sẽ hoạt động trên phần lớn các trình duyệt web (theo ý tôi là: IE 6+, Firefox 2+, Opera 9+)Cú pháp JSON cho tên thuộc tính

này có hiệu lực


var a={ "class": "Person", 
     "name": "William Shakespeare", 
     "birthday": -12802392000000, 
     "nickname": "Bill" 
     } ; 

Hoặc là thế này:


var a={ class: "Person", 
     name: "William Shakespeare", 
     birthday: -12802392000000, 
     nickname: "Bill" 
     } ; 

Và sự khác biệt giữa hai là gì?

Trả lời

30

@AndreasN is correct: JSON specification quy định việc sử dụng dấu ngoặc kép để thực sự là JSON. Nếu bạn không sử dụng dấu ngoặc kép, nó có thể là một đối tượng hợp lệ theo nghĩa đen trong Javascript, nhưng nó không phải là JSON. Các dịch vụ khác bên cạnh Javascript sử dụng Javascript bên trình duyệt (ví dụ: webservices sử dụng php, Java, v.v.) và nếu bạn xây dựng một chuỗi thiếu dấu ngoặc kép, không có gì đảm bảo rằng nó sẽ được phân tích cú pháp chính xác - mặc dù tôi nghi ngờ đủ mạnh để làm như vậy.

FYI rất nguy hiểm trong Javascript để trực tiếp sử dụng eval() trên chuỗi JSON từ các nguồn mà bạn không thể ngăn chặn các cuộc tấn công nguy hiểm. Một lần nữa, xem JSON site cung cấp thêm giải thích cũng như tệp javascript rất ngắn, phân tích cú pháp chuỗi JSON thành đối tượng Javascript một cách an toàn.

chỉnh sửa: Tôi đoán về mặt kỹ thuật câu hỏi ban đầu của bạn không phải về JSON mà là cú pháp của Javascript cho literals đối tượng. Sự khác biệt là các đối tượng constructable từ một chuỗi JSON sẽ loại trừ nhiều literals khác có thể đối tượng, ví dụ:

var a = {cat: "meow", dog: "woof"}; 
var aname = {cat: "Garfield", dog: "Odie"}; 
var b = { 
    counter: 0, 
    pow: function(x) { return x+1; }, 
    zap: function(y) { return (counter += y); } 
}; 
var c = { 
    all: [a,aname], 
    animals: a, 
    names: aname, 
}; 

Object literals "a" và "aname" có thể được thể hiện bằng JSON (bằng cách thêm dấu ngoặc kép để tên tài sản) . Nhưng đối tượng literals "b" và "c" không thể. Đối tượng chữ "b" chứa các hàm (không được phép trong JSON). Đối tượng chữ "c" ở trên chứa tham chiếu đến các biến khác theo cách không thể biểu diễn trong JSON vì một số tham chiếu được chia sẻ. Nếu bạn thực hiện thay đổi đối với c.names, nó cũng sẽ thay đổi c.all[1] vì chúng chia sẻ tham chiếu đến cùng một biến. JSON chỉ có thể thể hiện các đối tượng có cấu trúc cây (ví dụ: mỗi phần tử con của đối tượng tổng thể là độc lập).

7

Số spec nói để sử dụng "".

Firefox chấp nhận không có, nhưng IE thì không.

Pair được định nghĩa là

string : value 

Giá trị có thể là một chuỗi chuỗi được định nghĩa là

" chars " 
+0

IE cũng vậy. Ngay cả IE6 cũng chấp nhận nó. – Tomalak

+0

yeah, tôi đã không nhận thấy bất kỳ vấn đề với phương thức unquoted lớp – nickf

4

Bạn phải sử dụng "dấu ngoặc kép" xung quanh các thuộc tính có chứa bất cứ điều gì khác hơn là ký tự chữ

{foo-bar: 3} // invalid 
{"foo-bar": 3} // valid 

Khác hơn là không có sự khác biệt giữa hai và tôi tưởng tượng cả hai cách hoạt động trên tất cả các trình duyệt

8

Nếu IE không thành công với ví dụ thứ hai của bạn, vì 'Lớp' là từ dành riêng (chỉ trong IE). Nói chung nó luôn luôn tốt nhất để kèm theo tên tài sản của bạn với dấu ngoặc kép - làm điều này có nghĩa là nó sẽ luôn luôn làm việc, bất kể hoàn cảnh nào.

+2

thực sự là một từ dành riêng trong tất cả các trình duyệt. Nó chỉ là IE quyết định thất bại khi nó được sử dụng. – Triptych

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