Должны ли ключи JSON быть заключены в кавычки?

Пример: Допустим ли следующий код для спецификации JSON?

{
    precision: "zip"
}

Или я всегда должен использовать следующий синтаксис? (И если да, то почему?)

{
    "precision": "zip"
}

Я действительно не нашел что-то об этом в спецификациях JSON. Хотя они используют кавычки вокруг своих ключей в своих примерах.

Ответ 1

Да, вам нужны кавычки. Это делается проще и не нужно иметь другой метод escape для зарезервированных ключевых слов javascript, то есть {for:"foo"}.

Ответ 2

Вы правильно используете строки в качестве ключа. Вот отрывок из RFC 4627 - Тип приложения /json Media для нотации объектов JavaScript (JSON)

2,2. Объекты

Структура объекта представлена ​​в виде пары фигурных скобок   окружающие ноль или несколько пар имен/значений (или членов). Имя - это   строка. Каждое двоеточие появляется после каждого имени, отделяя имя   от значения. Одна запятая отделяет значение от следующего   имя. Имена внутри объекта СЛЕДУЕТ быть уникальными.

object = begin-object [ member *( value-separator member ) ] end-object

member = string name-separator value

[...]

2,5. Строки

Представление строк аналогично соглашениям, используемым в C   семейство языков программирования. Строка начинается и заканчивается   кавычки. [...]

string = quotation-mark *char quotation-mark

quotation-mark = %x22 ; "

Прочитайте весь RFC здесь.

Ответ 3

От 2.2. Объекты

Структура объекта представлена ​​в виде пары фигурных скобок, окружающих ноль или несколько пар имени/значения (или членов). Имя - это строка.

и от 2.5. Строки

Строка начинается и заканчивается кавычками.

Итак, я бы сказал, что в соответствии со стандартом: да, вы всегда должны указывать ключ (хотя некоторые парсеры могут быть более прощающими)

Ответ 4

Да, котировки являются обязательными. http://json.org/ говорит:

string
    ""
    " chars "

Ответ 5

Поскольку вы можете поместить "parent.child" пунктирную нотацию, и вам не нужно помещать родительский [ "child" ], который также действителен и полезен, я бы сказал, что оба способа являются технически приемлемыми. Парсеры должны делать все в порядке. Если вашему парсеру не нужны кавычки на клавишах, то, вероятно, лучше не ставить их (экономит место). Имеет смысл называть их строками, потому что это то, что они есть, и поскольку квадратные скобки дают вам возможность использовать значения для ключей, по сути, это совершенно бесполезно. В Json вы можете поставить...

>var keyName = "someKey";
>var obj = {[keyName]:"someValue"};

>obj
Object {someKey: "someValue"}

просто отлично, без проблем, если вам нужно значение для ключа, и ни одно из них не будет работать, поэтому, если это не так, вы не можете, поэтому вы не будете так "вам не нужны кавычки на ключи". Даже если правильно сказать, что это технически струны. Логика и использование утверждают иначе. Также официально не выводит Object { "someKey": "someValue" } для obj в нашем примере запускается из консоли любого браузера.