2009-05-19 10 views
12

Tôi đang sử dụng Firefox 3.5b4.JSON.parse() có yêu cầu trích dẫn kép không?

cảnh báo này [đối tượng Object], [đối tượng Object]:

var jsonString = '[{"foo": "one", "bar": 1}, {"foo": "two", "bar": 2}]'; 
var jsonObjects = JSON.parse(jsonString); 
alert(jsonObjects); 

Điều này cảnh báo một chuỗi rỗng, ví dụ: jsonObjects là null.

var jsonString = "[{'foo': '1', 'bar': 2}, {'foo': '3', 'bar': 4}]"; 
var jsonObjects = JSON.parse(jsonString); 
alert(jsonObjects); 

Tương tự như vậy đối với tên thuộc tính không được kiểm soát, tức là {foo: '1', bar: 2}.

Điều gì đang xảy ra? Tôi có thiếu một cái gì đó hiển nhiên, hoặc là có một quy tắc về đôi và đơn trích dẫn với JSON.parse? Cả ba phiên bản đều hoạt động OK với eval.

Trả lời

28

Tiêu chuẩn JSON ủy nhiệm dấu ngoặc kép.

Hãy nhớ rằng JSON không chỉ là "viết một đối tượng JS". Đó là một cú pháp rất nghiêm ngặt xảy ra cũng có thể đọc được như một đối tượng JS. Không phải mọi cú pháp hợp lệ JS đều là JSON hợp lệ. Trong thực tế, ví dụ của bạn không thực sự hợp lệ JSON, vì nó là một mảng các đối tượng trong khi tiêu chuẩn xác định rằng cấu trúc trên cùng PHẢI là một đối tượng.

Tất nhiên, hầu hết các trình phân tích cú pháp JSON linh hoạt hơn, cho phép các tùy chọn không chuẩn (như dấu nháy đơn); nhưng không dựa vào điều đó.

+3

Vị trí cấu trúc trên cùng phải là đối tượng ở đâu? [Tài liệu này] (http://www.ietf.org/rfc/rfc4627.txt?number=4627) đưa ra ví dụ về một mảng và [json.org] (http://json.org/) không dường như không xác định yêu cầu này. – Brendon

+0

http://stackoverflow.com/a/4201631/977939 điều này có giải thích: từ dự trữ. – jpillora

2

Để thêm vào những gì Javier nói, JSON giới hạn định dạng chủ yếu vì lý do bảo mật (vì vậy không thể gọi hàm, v.v.). Nếu bạn không quan tâm đến bảo mật, hãy sử dụng hàm "eval()" của javascript để chuyển đổi chuỗi thành đối tượng.

+1

Không sử dụng eval nếu bạn dự định sử dụng mã này trong tiện ích bổ sung. – sdwilsh