Những ký tự nào hợp lệ / không hợp lệ trong tên khóa JSON?


151

Có bất kỳ ký tự bị cấm nào trong tên khóa, cho các đối tượng JavaScript hoặc chuỗi JSON không? Hay những nhân vật cần được trốn thoát?

Để cụ thể hơn, tôi muốn sử dụng "$", "-" và khoảng trắng trong các tên chính.


Tôi nghĩ một phần câu trả lời này có liên quan đến cách bạn mã hóa. Ví dụ, UTF8 có các ký tự khác nhau được phép so với ANSI.
invalidsyntax

4
Bạn có thể sử dụng bất kỳ 'khóa' nào bạn muốn trong JS bằng cách sử dụng obj['whatever']ký hiệu. Nhưng chỉ các phím chữ và số thông thường mới có thể được sử dụng cho obj.whateverphiên bản.
Marc B

4
@invalidsyntax: JSON là Unicode theo định nghĩa. Ngoài ra, ANSI không phải là mã hóa, nó là một bộ ký tự, do đó, phép so sánh phải là Unicode-vs-ANSI, không phải UTF-8-vs-ANSI.
Marcelo Cantos

1
Thảo luận cũ nhưng, ASCII (cái mà mọi người thường nhắc đến bởi ANSI) là một mã hóa và trên hết nó cũng xác định một bộ ký tự.
Trinidad

Câu trả lời:


167

Không. Bất kỳ chuỗi hợp lệ là một khóa hợp lệ. Nó thậm chí có thể có "miễn là bạn thoát khỏi nó:

{"The \"meaning\" of life":42}

Có lẽ bạn sẽ gặp khó khăn khi tải các giá trị đó vào một số ngôn ngữ, chúng cố gắng liên kết các khóa với tên trường đối tượng. Tôi không biết bất kỳ trường hợp như vậy, tuy nhiên.


Cám ơn! Bất kỳ nhân vật khác sẽ cần phải được trốn thoát? Thích: hoặc; ?
Barshe

11
Không phải những cái đó. Bất cứ điều gì cần thoát trong JavaScript thường cần nó trong JSON. Tuy nhiên, tốt nhất để lấy nó từ miệng ngựa, tại json.org. Mất khoảng một phút để đọc toàn bộ thông số kỹ thuật từ đầu đến cuối.
Marcelo Cantos

3
Đây không phải là một câu trả lời tốt imho. Những loại nhân vật cần phải được trốn thoát? Những nhân vật nào có thể trốn thoát, nhưng không cần phải trốn thoát?
Daniel W.

Bất cứ ai cũng có thể làm rõ nếu điều này bao gồm những thứ như ký tự null null (U + 0000, "byte byte" đơn giản trong UTF-8), v.v.? Cả json.org và PDF đặc tả ECMA chính thức / chính thức được liên kết dường như ngụ ý rằng có, những cái đó là hợp lệ trong JSON, ngay cả ở dạng chữ của chúng (không chỉ ở \u four-hex-digitsdạng).
mtraceur

1
@OutofOrbit Bạn có thể tải nó vào một đối tượng chưa được kiểm tra không?
Marcelo Cantos

54

Các ký tự sau phải được thoát trong dữ liệu JSON để tránh mọi vấn đề

'trích dẫn

" Trích dẫn

dấu gạch chéo ngược

tất cả các ký tự điều khiển như \ n \ t

Trình phân tích cú pháp JSON có thể giúp bạn đối phó với JSON.

EDIT: Đây là một trình phân tích cú pháp JSON thay thế vì liên kết của OP đã chết


5
Xin chào Arun, dấu ngoặc đơn không cần phải thoát. Việc thoát khỏi chúng sẽ khiến các trình phân tích cú pháp JSON nghiêm ngặt đưa ra một ngoại lệ. Tham khảo phần chuỗi của json.org Tất nhiên tuy nhiên bạn sẽ cần thoát chúng khi ở trong chuỗi JSON (nhưng không phải chính JSON).
Alex KeySmith

5
@AlexKey bạn hoàn toàn đúng! Arun, bạn có thể kiểm tra điều này trên jsonlint.com bằng cách thử nghiệm JSON { "singlequotetest": "something here isn\'t right"}so với{ "singlequotetest": "Fixing here what wasn't right"}
Adrien Be

@Arun Rana - không phải lo lắng.
Alex KeySmith

3
{"* ~ @ # $% ^ & * () _ + => <? /": "là một json hợp lệ"}
Abhi

45
{"🐶🔫": "not nice, but still valid json"}
Marcelo Cantos

12

Điều đáng nói là trong khi bắt đầu các khóa bằng số là hợp lệ, nó có thể gây ra một số vấn đề ngoài ý muốn.

Thí dụ:

var testObject = {
    "1tile": "test value"
};
console.log(testObject.1tile); // fails, invalid syntax
console.log(testObject["1tile"]; // workaround

6
Tôi thực sự hy vọng rằng, trong thời đại 2017/18 này của Microsoft, họ rất hối hận về tất cả những nỗi đau mà họ đã gây ra.
monsto

1
Nhìn vào các tham số ID số liệu của họ: dev.applicationinsights.io/apiexplorer/iêu --- 15 hoặc 20 trường của họ có nhiều dấu gạch chéo về phía trước trong tên trường json của họ. Trong khi giải pháp Karns hoạt động cho một lĩnh vực cụ thể, tôi dường như không thể làm cho nó hoạt động cho một trường con 1tile. Ví dụ, một dấu chấm tiếp theo trả về không xác định cho tôi.
Jon Luzader

Tại sao IE được đề cập ở đó? Mã định danh bắt đầu bằng số là bất hợp pháp trong mỗi lần triển khai ECMAScript.
m93a

@ m93a IE không có nghĩa là từ viết tắt của Internet Explorer ... lựa chọn từ xấu: /
karns

Đây sẽ là câu trả lời tốt nhất
Joe Elia

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.