2013-03-12 31 views
24

Có thể có dấu ngoặc kép xung quanh các số JSON không? Trong hầu hết các liên kết tìm kiếm, có vẻ như các con số không "yêu cầu" trích dẫn. Nhưng, các trình phân tích cú pháp có nên chấp nhận cả hai số "attr" : 6"attr" : "6" không?Các số JSON có thể được trích dẫn không?

Nếu MyParser có phương thức getInt để lấy số cho khóa, nên MyParser.getInt("attr") trả về 6 trong cả hai trường hợp hoặc ném ngoại lệ trong trường hợp sau?

Trả lời

52

Trong JSON, 6 là số sáu. "6" là một chuỗi chứa chữ số6. Vì vậy, câu trả lời cho câu hỏi "Số json có thể được trích dẫn không?" về cơ bản là "không", bởi vì nếu bạn đặt chúng trong dấu ngoặc kép, chúng không phải là số nữa.

Nhưng, các trình phân tích cú pháp có chấp nhận cả hai "attr": 6 và attr: "6" không?

Ví dụ thứ hai là không hợp lệ, vì attr phải nằm trong dấu ngoặc kép, ví dụ:

{"attr": "6"} 

... là hợp lệ, và xác định một đối tượng với một tài sản gọi là attr với chuỗi giá trị"6" , trong khi:

{"attr": 6} 

... hợp lệ và xác định đối tượng có thuộc tính được gọi là.210 với giá trị số6, và cuối cùng là:

{attr: 6} 

... và

{attr: "6"} 

... đều JSON không hợp lệ vì tên thuộc tính phải nằm trong dấu ngoặc kép.

Nếu MyParser có phương thức getInt để lấy số cho khóa, nên MyParser.getInt ("attr") trả về 6 trong cả hai trường hợp hoặc ném ngoại lệ trong trường hợp sau?

Đó là một quyết định thiết kế cho người cung cấp các phân tích cú pháp, về cơ bản là sự lựa chọn giữa getInt là nghiêm ngặt (ném một ngoại lệ nếu bạn thử nó trên "attr": "6") hoặc lỏng (ép buộc "6"-6 và trở về đó). JavaScript thường bị mất, và vì vậy có thể có một lý lẽ cho việc bị mất; ngược lại, thực tế là JavaScript bị mất đôi khi gây ra rắc rối, có thể là một lý lẽ cho việc nghiêm ngặt.

3

Điều đó sẽ phụ thuộc vào ngôn ngữ bạn sử dụng để lấy số nguyên, vì nếu ngôn ngữ lập trình không cung cấp chuyển đổi ẩn từ chuỗi thành int, bạn có thể gặp sự cố.

Bạn không nên lo lắng quá nhiều, vì ngôn ngữ lập trình hiện đại ngày nay có thể chuyển đổi hoàn toàn chuỗi thành một số không có mã bổ sung.Một cái gì đó bạn nên đi vào xem xét được, khi sử dụng ngôn ngữ lập trình như JavaScript, khi bạn sử dụng ===== khi so sánh giá trị, === đưa vào xem xét loại của giá trị trong khi == không, vì vậy 6 === "6" sẽ trở lại false, trong khi 6 == "6" sẽ trở lại true.

Trả lời câu hỏi của bạn, nó sẽ không ném ngoại lệ nếu bạn đang sử dụng ngôn ngữ lập trình cung cấp chuyển đổi ẩn từ chuỗi thành int.