Tại thời điểm viết bài, JSON chỉ được mô tả trong RFC4627 . Nó mô tả (ở đầu "2") một văn bản JSON là một đối tượng hoặc mảng được tuần tự hóa.
Điều này có nghĩa là chỉ {}
và []
là các chuỗi JSON hoàn chỉnh, hợp lệ trong các trình phân tích cú pháp và chuỗi ký tự tuân thủ tiêu chuẩn đó.
Tuy nhiên , việc giới thiệu ECMA-404 thay đổi điều đó và lời khuyên cập nhật có thể được đọc tại đây . Tôi cũng đã viết một bài blog về vấn đề này.
Tuy nhiên, để gây nhầm lẫn hơn nữa, JSON
đối tượng (ví dụ JSON.parse()
và JSON.stringify()
) có sẵn trong trình duyệt web được tiêu chuẩn hóa trong ES5 và điều đó xác định rõ các văn bản JSON có thể chấp nhận như vậy:
Định dạng trao đổi JSON được sử dụng trong đặc tả này chính xác được mô tả bởi RFC 4627 với hai ngoại lệ:
Điều này có nghĩa là tất cả các giá trị JSON (bao gồm chuỗi, null và số) được đối tượng JSON chấp nhận, mặc dù đối tượng JSON tuân thủ kỹ thuật RFC 4627.
Lưu ý rằng do đó bạn có thể xâu chuỗi một số trong trình duyệt phù hợp thông qua JSON.stringify(5)
, trình duyệt này sẽ bị từ chối bởi một trình phân tích cú pháp khác tuân thủ RFC4627, nhưng không có ngoại lệ cụ thể được liệt kê ở trên. Ruby, ví dụ, dường như là một ví dụ như vậy chỉ chấp nhận các đối tượng và mảng là gốc . Mặt khác, PHP đặc biệt bổ sung ngoại lệ rằng "nó cũng sẽ mã hóa và giải mã các loại vô hướng và NULL".