Я внимательно прочитал описание JSON http://json.org/, но не уверен, что знаю ответ на простой вопрос. Какие строки являются минимально возможным допустимым JSON?
"string"
допустимая строка JSON?42
допустимо ли простое число JSON?true
логическое значение является допустимым JSON?{}
пустой объект является допустимым JSON?[]
пустой массив является допустимым JSON?
javascript
json
validation
Бессарабов
источник
источник
Ответы:
На момент написания статьи JSON был описан исключительно в RFC4627 . Он описывает (в начале «2») текст JSON как сериализованный объект или массив.
Это означает, что только
{}
и[]
являются действительными, полные строки JSON в синтаксических анализаторах и строковых преобразователях, которые соответствуют этому стандарту.Однако , введение ECMA-404 меняет это, и обновленный совет можно прочитать здесь . Я также написал сообщение в блоге по проблеме.
Однако, чтобы еще больше запутать этот вопрос,
JSON
объект (например,JSON.parse()
иJSON.stringify()
), доступный в веб-браузерах, ситуацию , стандартизирован в ES5 , и это четко определяет приемлемые тексты JSON, например, так:Это будет означать, что все значения JSON (включая строки, нули и числа) принимаются объектом JSON, даже если объект JSON технически соответствует RFC 4627.
Обратите внимание, что вы могли бы поэтому преобразовать число в соответствующий браузер через
JSON.stringify(5)
, который был бы отклонен другим синтаксическим анализатором, который соответствует RFC4627, но у которого нет определенного исключения, перечисленного выше. Например, может показаться , что Ruby является одним из таких примеров, который принимает в качестве корневого объекта только объекты и массивы . PHP, с другой стороны, специально добавляет исключение, что «он также будет кодировать и декодировать скалярные типы и NULL».источник
true
,false
илиnull
один действительный текст JSON? Не могли бы вы привести источник, поскольку это противоречит большинству других ответов / комментариев здесь?В Интернете есть как минимум четыре документа, которые можно считать стандартами JSON. RFCs, на которые все ссылаются, описывают тип пантомимы
application/json
. Вот что каждый должен сказать о значениях верхнего уровня и о том, разрешено ли что-либо кроме объекта или массива наверху:RFC-4627 : Нет.
Обратите внимание, что RFC-4627 был помечен как «информационный», а не «предлагаемый стандарт», и что он устарел в RFC-7159 , который, в свою очередь, устарел в RFC-8259.
RFC-8259 : да.
RFC-8259 датирован декабрем 2017 года и имеет пометку «ИНТЕРНЕТ СТАНДАРТ».
ECMA-262 : да.
ECMA-404 : да.
источник
Согласно старому определению в RFC 4627 (которое было отменено в марте 2014 года RFC 7159), все они были действительными «значениями JSON», но только последние два составляли полный «текст JSON»:
В зависимости от используемого парсера, одиночные «значения JSON» могут быть приняты в любом случае. Например (придерживаясь терминологии «значение JSON» и «текст JSON»):
JSON.parse()
функция в настоящее время стандартизировано в современных браузерах принимает любое «JSON значение»json_decode
была введена в версии 5.2.0, принимающей только весь «текст JSON», но была исправлена, чтобы принимать любое «значение JSON» в версии 5.2.1json.loads
принимает любое «значение JSON» в соответствии с примерами на этой странице руководстваРазличие немного похоже на различие между «XML-документом» и «XML-фрагментом», хотя технически
<foo />
это правильно сформированный XML-документ (лучше было бы записать его<?xml version="1.0" ?><foo />
, но, как указано в комментариях,<?xml
объявление технически необязательно ).источник
<foo />
это правильно сформированный XML-документ, но недействительный . (Но то же самое относится и к<?xml version="1.0" ?><foo />
.)<foo />
может быть или не быть действительным по отношению к конкретной схеме , но это не то, что этот стандарт заявляет.Спецификация ecma может быть полезна для справки:
http://www.ecma-international.org/ecma-262/5.1/
источник
JSON.parse
функция была добавлена в более поздние версии стандарта ECMAScript, основанного на грамматике Крокфорда и RFC.JSON.parse("\"string\"");
JSON означает JavaScript Object Notation. Только
{}
и[]
определите объект Javascript. Другие примеры являются литералами значений. В Javascript есть типы объектов для работы с этими значениями, но выражение"string"
представляет собой представление исходного кода буквального значения, а не объекта.Имейте в виду, что JSON не является Javascript. Это нотация, которая представляет данные. Он имеет очень простую и ограниченную структуру. Данные JSON структурированы с использованием
{},:[]
символов. Вы можете использовать только литеральные значения внутри этой структуры.Для сервера вполне допустимо отвечать либо описанием объекта, либо литеральным значением. Все парсеры JSON должны обрабатываться только для обработки буквального значения, но только для одного значения. JSON может представлять только один объект одновременно. Таким образом, чтобы сервер возвращал более одного значения, он должен был бы структурировать его как объект или массив.
источник
Да, да, да, да и да. Все они являются допустимыми литералами значения JSON.
Однако официальный RFC 4627 гласит:
Таким образом, весь «файл» должен состоять из объекта или массива в качестве внешней структуры, которая, конечно, может быть пустой. Тем не менее, многие анализаторы JSON также принимают примитивные значения для ввода.
источник
Таким образом, ваш ответ,
"{}"
который обозначает пустой объект.источник
undefined
, а не "{}" `Просто следуйте железнодорожным схемам, приведенным на странице json.org . [] и {} - минимально возможные допустимые объекты JSON. Таким образом, ответ [] и {}.
источник
array
иobject
вы были бы правы, но разумно ожидать,value
что будет старт.values
правила , вместо (или в дополнение к нему )array
иobject
правила, то автономные номера и строки действительный JSON документ.[]
хотя действительный текст JSON для каждой спецификации, который когда-либо имел мнение по этому вопросу, не является «действительным объектом JSON», поскольку это не объект JSON. «Объект» в JSON конкретно относится к{}
нотации; Массивы JSON не являются объектами JSON.