Чи може масив бути JSON-текстом верхнього рівня?


Відповіді:


126

Так, масив легальний як JSON-текст верхнього рівня.

Існує три стандартні документи, що визначають JSON: RFC 4627 , RFC 7159 (який застаріло RFC 4627) та ECMA-404 . Вони відрізняються тим, які елементи верхнього рівня вони дозволяють, але всі дозволяють об'єкт або масив як елемент верхнього рівня.

  • RFC 4627: Об'єкт або масив.
    "Текст JSON - це серіалізований об'єкт або масив."
  • RFC 7159: Будь-яке значення JSON.
    "Текст JSON - це серіалізоване значення."
  • ECMA-404: Будь-яке значення JSON.
    "Текст JSON - це послідовність лексем, утворена з кодових точок Unicode, яка відповідає граматиці значення JSON."

2
Що стосується цього більш нового RFC , "текст JSON - це послідовність лексем. Набір лексем включає шість структурних символів, рядків, чисел та три буквальні назви".
antak

63

Так , але вам слід розглянути можливість створення root об'єктом замість деяких сценаріїв через викрадення JSON . Це вразливість розкриття інформації, заснована на переосмисленні конструктора масивів у JavaScript.


11
Так, це відмінна відмінна відповідь - не тільки сказати ОП те, що вони хотіли знати, а й те, що вони повинні знати (але не усвідомлювали). Насправді, існує маса вразливостей, пов’язаних з JSON, що аналізує Javascript, викрадення JSON - лише один приклад.
sleske


4

Це з специфікації ECMAScript.

JSONText:
    JSONValue

JSONValue:
    JSONNullLiteral 
    JSONBooleanLiteral 
    JSONObject 
    JSONArray 
    JSONString 
    JSONNumber

1
Це трохи вводить в оману, оскільки ECMAScript дозволяє розбирати рядки JSON, які не є текстами вищого рівня. За даними RFC, "текст JSON - це серіалізований об'єкт або масив".
Меттью Флашен

@Matthew - Дивно, мені цікаво, як Крокфорд ставиться до цього. Як вони зможуть узгодити відмінності між RFC та ECMA?
ChaosPandion

3
Я просто подивився і виявив, що вони знають різницю. З пункту 15.12 ECMAScript 5, "Виробництво JSONText верхнього рівня граматики ECMAScript JSON може складатися з будь-якої JSONValue, а не обмежуватися лише JSONObject або JSONArray, як визначено RFC 4627." Я не знаю, чи змінить IETF RFC.
Метью Флашен

@Matthew - Спасибі за це, я жахливо розгубився. Опис json.org не кажучи вже про більш обмежувальне поняття «JSON-текст» на всіх , і вид RFC , по розпливчастим про його значення.
mrec

Ця відповідь стосується ECMAScript, а питання про JSON. Хоча вони (навмисно) схожі, вони різні характеристики .
sleske

2

так, спробуйте це тут.

http://www.jsonlint.com/

і ввести [{}]


3
Це навіть простіше, ніж це. Помістіть, []і він підтвердиться.
сорпігал

Посилання мертве, оновіть або видаліть цю відповідь - майже лише за посиланням.
Антон

1

Існує деяка плутанина, помічена в інших коментарях. Тип мультимедіа "application / json" дозволяє лише об'єкт або масив на верхньому рівні для JSON-тексту, за JSON RFC . Однак для аналізатора будь-яке значення JSON є прийнятним, як видно із специфікації ECMAScript.


Будь-яке значення JSON як елемента верхнього рівня є прийнятним для аналізатора ECMAScript , але не для (сумісного) аналізатора JSON - важлива відмінність.
sleske

Це цікава відмінність, але я не розумію, що ви говорите. Що таке визначення "(сумісного) аналізатора JSON"?
cdunn2001

1
Що ж, аналізатор JSON - це аналізатор граматики JSON. Хоча JSON схожий на Javascript, він відрізняється (набагато простішою) граматикою. Див. Tools.ietf.org/html/rfc7159 , де описано граматику JSON. "сумісний" просто означає, що парсер насправді слідує граматиці (якої повинен бути будь-який гідний аналізатор).
sleske

3
RFC 4627 застарілий, більше не слідкуйте за цим. Новий RFC дозволяє також прості значення на верхньому рівні.
Matthias Dieter Wallnöfer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.