Які символи дійсні / недійсні в імені ключа JSON?


151

Чи є заборонені символи в ключових іменах, для об’єктів JavaScript або рядків JSON? Або символи, яких потрібно уникнути?

Щоб бути більш конкретним, я хотів би використовувати "$", "-" та пробіл у ключових назвах.


Я думаю, що ця відповідь частково має відношення до способу кодування. Наприклад, UTF8 має різні символи, дозволені порівняно з ANSI.
інвалідність

4
Ви можете використовувати будь-який 'ключ', який ви хочете в JS, використовуючи obj['whatever']позначення. Але для obj.whateverверсії можна використовувати лише звичайні буквено-цифрові клавіші .
Марк Б

4
@invalidsyntax: JSON є Unicode за визначенням. Крім того, ANSI не є кодуванням, це набір символів, тому порівняння має бути Unicode-vs-ANSI, а не UTF-8-vs-ANSI.
Марсело Кантос

1
Стара дискусія, але ASCII (те, що люди часто посилаються на ANSI) - це кодування, а крім того, воно також визначає набір символів.
Тринідад

Відповіді:


167

Ні. Будь-яка дійсна рядок є дійсним ключем. Це навіть може бути ", поки ви уникнете цього:

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

Можливо, у вас виникнуть труднощі з завантаженням таких значень на деякі мови, які намагаються пов’язати ключі з іменами об'єктних полів. Однак я не знаю таких випадків.


Дякую! Будь-які інші символи, яких потрібно було б уникнути? Як: або; ?
Крістоф

11
Не ті. Незалежно від потреби в JavaScript, воно, як правило, потрібно в JSON. Найкраще дістати це з вуст коня, хоча на json.org. Щоб прочитати всю специфікацію в кінці, потрібна приблизно одна хвилина.
Марсело Кантос

3
Це не гарна відповідь. Які символи потрібно уникати? З яких персонажів можна втекти, але не потрібно їх уникати?
Даніель В.

Хтось може уточнити, чи включають такі речі, як нульовий символ Unicode (U + 0000, звичайний "null byte" в UTF-8) тощо? Як і json.org, так і пов'язаний офіційний / офіційний специфікаційний документ ECMA вказують на те, що так, вони є дійсними в JSON навіть у їхніх буквальних формах (а не лише у \u four-hex-digitsформі).
mtraceur

1
@OutofOrbit Ви можете просто завантажити його в нетиповий об'єкт?
Марсело Кантос

54

Наступні символи повинні бути залишені в даних JSON, щоб уникнути будь-яких проблем

'єдина цитата

Цитата

\ зворотній кут

усі символи управління, такі як \ n \ t

JSON Parser може допомогти вам боротися з JSON.

EDIT: Ось замінний аналізатор JSON, оскільки посилання OP не працює


5
Привіт Арун, одиночні цитати не потрібно уникати. Якщо втеча від них, це призведе до того, що строгі парсери JSON можуть викинути виключення. Зверніться до розділу рядків на json.org Звичайно, однак вам знадобиться уникнути їх, коли всередині рядка JSON (але не самого JSON).
Alex KeySmith

5
@AlexKey ти абсолютно правий! Арун, ти можеш перевірити це на jsonlint.com , протестувавши JSON { "singlequotetest": "something here isn\'t right"}проти{ "singlequotetest": "Fixing here what wasn't right"}
Адрієн Бе

@Arun Rana - не хвилюйся.
Alex KeySmith

3
{"* ~ @ # $% ^ & * () _ + => <? /": "є дійсним json"}
Абхі

45
{"🐶🔫": "not nice, but still valid json"}
Марсело Кантос

12

Варто зазначити, що при запуску клавіш цифрами є дійсним, це може спричинити деякі непередбачувані проблеми.

Приклад:

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

6
Я дуже сподіваюся, що в цьому віці Майкрософт у 2017/18 роках вони шкодують про всі болі, які їм заподіяли.
Монсто

1
Подивіться на їх параметри ідентифікаторів метрик: dev.applicationinsights.io/apiexplorer/… --- 15 або 20 їхніх полів мають кілька прямих косої риски у своїх назвах полів json. Хоча рішення Карнса працює для конкретного поля, я, здається, не можу змусити його працювати для підполя 1tile. Наприклад, наступна точка повертається для мене невизначеною.
Джон Лузадер

Чому там згадується IE? Ідентифікатори, що починаються з числа, є незаконними в кожній реалізації ECMAScript.
m93a

@ m93a IE не означає як абревіатуру для Internet Explorer ... поганий вибір слів: /
karns

Це має бути найкращою відповіддю
Джо Елія

7

Необхідно уникати кодових точок Unicode U + D800 до U + DFFF: вони недійсні в Unicode, оскільки вони зарезервовані для сурогатних пар UTF-16. Деякі кодери / декодери JSON замінять їх на U + FFFD. Подивіться, наприклад, як мова Go та їх бібліотека JSON справляється з ними .

Тому уникайте "\ uD800" до "\ uDFFF" поодинці (не в сурогатних парах).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.