Какие символы допустимы / недействительны в имени ключа JSON?


151

Есть ли запрещенные символы в именах ключей, для объектов JavaScript или строк JSON? Или символы, которые нужно экранировать?

Чтобы быть более конкретным, я бы хотел использовать «$», «-» и пробел в именах ключей.


Я думаю, что частично этот ответ связан с тем, как вы кодируете. Например, в UTF8 допускаются разные символы по сравнению с ANSI.
Неработающий

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

4
@invalidsyntax: JSON - это Юникод по определению. Кроме того, ANSI не является кодировкой, это набор символов, поэтому сравнение должно быть Unicode-vs-ANSI, а не UTF-8-vs-ANSI.
Марсело Кантос

1
Старая дискуссия, но ASCII (то, что люди часто называют ANSI) - это кодировка, которая также определяет набор символов.
Тринидад

Ответы:


168

Нет. Любая допустимая строка является допустимым ключом. Это может даже произойти, "пока вы избежите этого:

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

Возможно, у вас возникнут трудности с загрузкой таких значений в некоторые языки, которые пытаются связать ключи с именами полей объекта. Однако я не знаю ни одного подобного случая.


Спасибо! Любые другие персонажи, которые должны быть экранированы? Как: или; ?
Кристоф

11
Не те. Что бы ни требовалось в JavaScript, обычно это нужно в JSON. Лучше всего получить его изо рта лошади, однако, на json.org. Для полного прочтения всей спецификации требуется около одной минуты.
Марсело Кантос

3
Это не очень хороший ответ. Какие символы нужно экранировать? Какие символы могут быть экранированы, но не обязательно экранироваться?
Даниэль В.

Может кто-нибудь уточнить, включает ли это такие вещи, как нулевой символ Unicode (U + 0000, обычный «нулевой байт» в UTF-8) и т. Д.? Как json.org, так и связанная PDF- версия официальной / официальной спецификации ECMA, по-видимому, подразумевают, что да, они действительны в JSON, даже в их буквальных формах (не только в \u four-hex-digitsформе).
mtraceur

1
@OutofOrbit Можете ли вы просто загрузить его в нетипизированный объект?
Марсело Кантос

54

Следующие символы должны быть экранированы в данных JSON, чтобы избежать каких-либо проблем

одиночная цитата

Цитата

\ обратная косая черта

все управляющие символы, такие как \ n \ t

JSON Parser может помочь вам разобраться с JSON.

РЕДАКТИРОВАТЬ: Вот замена парсера JSON, так как ссылка OP не работает


5
Привет Арун, одиночные кавычки не нужно экранировать. Фактический выход из них приведет к тому, что строгие парсеры JSON выдают исключение. Обратитесь к строковому разделу json.org Конечно, вам нужно будет избегать их, когда они находятся внутри строки JSON (но не самого JSON).
Алекс КейСмит

5
@AlexKey ты полностью прав! Арун, ты можешь проверить это на jsonlint.com , протестировав JSON { "singlequotetest": "something here isn\'t right"}против{ "singlequotetest": "Fixing here what wasn't right"}
Adrien Be

@ Арун Рана - не беспокойся.
Алекс КейСмит

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
Я действительно надеюсь, что в этом возрасте Microsoft 2017/18 года они сожалеют о всей боли, которую они причинили.
monsto

1
Посмотрите на их параметры идентификатора метрик: dev.applicationinsights.io/apiexplorer/… --- 15 или 20 их полей имеют несколько прямых косых черт в именах полей json. Хотя решение Karns работает для конкретной области, я не могу заставить его работать для подполя 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.