В последнее время я немного узнал о JSON и пытался понять, всегда ли ему нужны фигурные скобки на верхнем уровне или он также может быть массивом? Или массив должен быть заключен в фигурные скобки с именем ключа, а затем массив в качестве значения?
Например, должно ли быть так:
{"title":"title 1"}
а может быть и это:
[1,2,3]
Я спрашиваю в контексте того, что позволяет спецификация и что могут ожидать потребители файла json, как обычно из примеров, которые я видел, это всегда фигурные скобки с парами ключ-значение внутри
Вы спрашиваете о стандарте или о том, что вам практически может сойти с рук?
Это может быть массив, не обязательно в фигурных скобках
console.info(JSON.stringify([1,2,3]));
Вот ещё
это может быть следующее:
Примеры:
JSON.parse('{}'); // {}
JSON.parse('true'); // true
JSON.parse('"foo"'); // "foo"
JSON.parse('[1, 5, "false"]'); // [1, 5, "false"]
JSON.parse('null'); // null
В оригинальной спецификации говорилось:
Текст JSON — это сериализованный объект или массив.
… это означает, что верхний уровень должен быть либо {}
, либо []
.
Многие реализации игнорировали это ограничение и позволяли использовать любой тип данных JSON (объект, массив, число, строка, логическое значение, нуль) на верхнем уровне.
обновленная спецификация гласит:
Текст JSON представляет собой сериализованное значение. Обратите внимание, что некоторые предыдущие Спецификации JSON ограничивали текст JSON, чтобы быть объектом или множество. Реализации, которые генерируют только объекты или массивы, где Текст JSON, который требуется, будет совместим в том смысле, что все реализации примут их как соответствующие тексты JSON.
Так что теперь любой тип данных JSON разрешен на верхнем уровне, но вы должны знать, что некоторые старые программы могут не поддерживать ничего, кроме объектов и массивов на верхнем уровне.
Implementations that generate only objects or arrays where a JSON text is called for will be interoperable in the sense that all implementations will accept these as conforming JSON texts
Что это значит?
Также мое продолжение @Quentin заключается в том, как будут использоваться файлы json других типов, есть ли примеры этого или это просто случай, когда это разрешено, но никто никогда этого не делает. Например, если бы JSON мог содержать только одну строку или набор строк, разделенных запятыми, было бы это вообще практично? Поскольку я когда-либо видел, что он используется только с {}
@jobe — это означает, что старый сериализатор, который может генерировать только JSON на основе {}
или []
, будет генерировать JSON, который может быть проанализирован синтаксическим анализатором, поддерживающим новый стандарт.
«Например, если бы JSON мог содержать только одну строку» — тогда синтаксический анализатор вывел бы строку
«или набор строк, разделенных запятыми» — тогда синтаксический анализатор выдаст исключение. Это будет недопустимый JSON.
«А будет ли это вообще практично?» - Вероятно. Где-то. Я не сразу думаю о каких-либо вариантах использования.
Спасибо, это помогает объяснить несколько вещей, в которых я не был уверен, поскольку обычно, изучая API, я видел только фигурную объектную форму JSON.