Почему JSON позволяет использовать только строку в качестве ключа?

Почему JSON позволяет только string быть ключом пары? Почему бы не использовать другие типы, такие как null, number, bool, object, array? Учитывая, что JSON тесно связан с JavaScript, могу ли я сделать вывод о причине из спецификации JavaScript (ECMA-262)? Я совершенно новичок в JavaScript, не могли бы вы помочь мне указать на это.


person pipipi    schedule 16.02.2012    source источник
comment
Я бы не сказал, что JSON является частью JavaScript. Его структуры данных основаны на литеральной нотации объектов и массивов, найденной в JavaScript, но ее существование не зависит от ECMA-262.   -  person    schedule 16.02.2012


Ответы (3)


Формат JSON преднамеренно основан на подмножестве синтаксиса литерала объекта JavaScript и синтаксиса литерала массива, а объекты JavaScript могут иметь только строки в качестве ключей, поэтому ключи JSON также являются строками. (Хорошо, вы можете использовать числа как ключи объекта JavaScript, но на самом деле они преобразуются в строки.)

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

«Учитывая, что JSON является частью JavaScript»

Нет, это не так. Новые браузеры предоставляют методы для создания и анализа JSON, но они не являются частью языка как такового, за исключением того, что JSON — это строковый формат, а JavaScript может обрабатывать строки. JSON всегда является строковым представлением — его необходимо проанализировать, чтобы создать объект для использования в JavaScript (или других языках), и как только это произойдет, JavaScript (или другие языки) обработает полученный объект так же, как любой другой объект.

(Обратите также внимание, что конкретный бит JSON не обязательно имеет какие-либо ключи: это может быть просто массив, например '["one","two","three"]'.)

person nnnnnn    schedule 16.02.2012
comment
Строка почти напрямую поддерживается на разных языках, но объект должен быть настроен. Мы должны сделать что-то, чтобы работать с объектом из значения, это может быть то же самое для ключа. Если бы мы сделали ограниченный ключ, который мог бы быть только строкой из-за легкости обмена между языками, то это означало бы, что значение также было бы ограничено. Я бы предпочел считать это пороком в JavaScript. - person pipipi; 16.02.2012
comment
JSON предназначен для обмена данными. Если данные вашего приложения настолько сложны, что вы не можете найти способ представить их, используя только имена ключей на основе строк, то я бы предположил, что вы слишком усложняете себе задачу. Если вы чувствуете, что должны иметь объекты в качестве ключей, вы можете сделать это в JSON, включив (вложенный) объект keys, который сопоставляет строковые имена свойств с объектами, чтобы эти объекты становились своего рода виртуальными ключами. Ответ на ваш первоначальный вопрос: почему только строки? потому что это все, что нужно для целей JSON, и это то, на чем остановился первоначальный дизайнер. - person nnnnnn; 16.02.2012

Основная причина, по мнению первооткрывателя представления JSON, заключается в том,

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

См. выступление Дугласа Крокфорда, первооткрывателя представление JSON.

Пример:

{ 
    id: 1234, 
    name: "foo", 
    do: "somthing"
} 

Поскольку JSON поддерживает разные языки, мы можем использовать этот набор данных на многих языках. Но слово do является ключевым словом в Javascript. Это приведет к синтаксической ошибке при разборе.

person Aparichith    schedule 21.04.2016
comment
хотя большинство языков программирования не используют числа в качестве ключей, но числа также не разрешены. - person Ivor Zhou; 21.11.2016

Потому что именно так была написана спецификация.

person Community    schedule 16.02.2012
comment
Тогда почему так написано. Все приходит с причиной. - person pipipi; 16.02.2012
comment
@paladin_t -- Не обязательно. Иногда это просто желание автора. - person Hot Licks; 16.02.2012
comment
@Hot Licks, это разумно. - person pipipi; 16.02.2012
comment
@paladin_t -- Не обязательно -- многие писатели совершенно неразумны. ;) - person Hot Licks; 16.02.2012
comment
-- вставьте антишуточный куриный мем -- :-) - person Ciro Santilli 新疆再教育营六四事件ۍ 08.11.2016
comment
@Hot Licks, но даже если бы это было просто предпочтением автора, немногие люди (особенно инженеры) принимают чисто произвольные решения. - person Sensei James; 02.10.2018