Чи може JSON починати з “[”?


178

З того, що я можу прочитати далі json.org , усі рядки JSON повинні починатися з {(фігурна дужка), а [символи (квадратні дужки) являють собою елемент масиву в JSON.

Я використовую json4jбібліотеку, і я отримав вхід, який починається з [, тому я не вважав, що це JSON. Я коротко переглянув схему JSON, але насправді не міг знайти, як було зазначено, що файл JSON не може починатись [або що він може починатися лише з {.


(Мабуть, існує кілька погано розроблених бібліотек JSON, які вимагають, щоб ви знали найбільш зовнішній тип JSON. Найпростіший "виправлення" тут - оточити рядок JSON [], проаналізувати його як масив та взяти перший елемент масиву.)
Гарячі лизання

Мабуть, безпечніше це починати з {, а не [так, що це не допустимий масив Javascript, і його не можна використовувати для атак CSRF.
Девід Клемффнер

Відповіді:


218

JSON може бути масивом або об'єктом. Конкретно від json.org:

JSON побудований на двох структурах:

  • Колекція пар імен / значень. У різних мовах це реалізується як об'єкт, запис, структура, словник, хеш-таблиця, список клавіш або асоціативний масив.
  • Впорядкований список значень. У більшості мов це реалізується як
    масив, вектор, список чи послідовність.

Потім вона описує дві структури як: Об'єкт JSON Масив JSON

Зауважте, що початковий та кінцевий символи - це фігурні дужки та квадратні дужки відповідно.

Редагувати
та звідси: http://www.ietf.org/rfc/rfc4627.txt

Текст JSON - це послідовність лексем. Набір лексем включає шість структурних символів, рядків, цифр та три буквальних імена.

Текст JSON - це серіалізований об'єкт або масив.

Оновлення (2014 р.)

Станом на березень 2014 року з'явився новий JSON RFC ( 7159 ), який дещо змінює визначення (див. Сторінки 4/5).

Визначення для RFC 4627 було: JSON-text = object / array

Це було змінено в RFC 7159 на: JSON-text = ws value ws

Де wsпредставляє пробіл і valueвизначається наступним чином:

Значення JSON ОБОВ'ЯЗКОВО має бути об'єктом, масивом, числом або рядком або одним із наступних трьох буквальних імен:

false null true

Отже, відповідь на питання все ще так, текст JSON може починатися з квадратної дужки (тобто масиву). Але крім об’єктів і масивів, тепер це також може бути число, рядок або значення false, nullабо true.

Також це змінилося від моєї попередньої цитати RFC 4627 (наголос додано):

Текст JSON - це послідовність лексем. Набір лексем включає шість структурних символів, рядків, цифр та три буквальних імена.

Текст JSON - це серіалізоване значення . Зауважте, що деякі попередні технічні характеристики JSON обмежували текст JSON об’єктом чи масивом. Реалізації, що генерують лише об'єкти або масиви, де викликається текст JSON, будуть взаємодіючими в тому сенсі, що всі реалізації приймуть їх як відповідні тексти JSON.


дякую, я дивлюся на цю цифру багато разів, мабуть, є проблема з бібліотекою json4j, яка не любить json з [.
Тіберіу

1
@Tiberiu Hajas: Мені знадобилося трохи часу, щоб зрозуміти це, коли я вперше знайшов це. Але побачивши кілька прикладів JSON та порівнявши їх, мені дуже подобається, як вони це зробили. Що стосується json4j, можливо , ви можете уявити звіт про помилку json4j бібліотеки творця .
Річард Марскелл - Дракір

Я, мабуть, спізнився на вечірку. Але те, що я знайшов у RFC 8259, говорить про те, що текст JSON - це послідовність лексем, утворена з кодових точок Unicode, яка відповідає граматиці значення JSON. Набір жетонів включає шість структурних лексем, рядків, чисел та три буквальних імені лексеми. Це звучить приблизно так, як це законно: {"1234"}, {true}. Однак що це означає? Це не масив, оскільки немає <code> [] </code>, також це не об'єкт, оскільки їх два.
Ніколас Хамфрі

1
@NicholasHumphrey Те, що я написав вище, все ще застосовується у 8259 р. У тому самому розділі 2 (граматика JSON) JSON-текст (він же документ JSON) визначається як: JSON-text = ws value wsде "значення JSON ОБОВ'ЯЗКОВО бути об'єктом, масивом, номером або рядком, або одне з наступних трьох буквальних імен: false, null, true "відповідно до розділу 3 (Значення). Ваш приклад не відповідає цим обмеженням, тому JSON не є дійсним.
Річард Марскелл - Дракір

8

Якщо рядок, яку ви розбираєте, починається з лівої дужки ([), яку ви можете використовувати JSONArray.parseдля повернення об'єкта JSONArray, а потім ви можете використовувати get(i)де i - індекс від 0 до повернутого JSONArray size()-1.

import java.io.IOException;
import com.ibm.json.java.JSONArray;
import com.ibm.json.java.JSONObject;

public class BookListTest {
   public static void main(String[] args) {
      String jsonBookList = "{\"book_list\":{\"book\":[{\"title\":\"title 1\"},{\"title\":\"title 2\"}]}}";
      Object book_list;
      try {
         book_list = JSONObject.parse(jsonBookList);
         System.out.println(book_list);
         Object bookList = JSONObject.parse(book_list.toString()).get("book_list");
         System.out.println(bookList);
         Object books = JSONObject.parse(bookList.toString()).get("book");
         System.out.println(books);
         JSONArray bookArray = JSONArray.parse(books.toString());
         for (Object book : bookArray) {
            System.out.println(book);
         }
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}

Який отримав вихід, як:

{"book_list":{"book":[{"title":"title 1"},{"title":"title 2"}]}}
{"book":[{"title":"title 1"},{"title":"title 2"}]}
[{"title":"title 1"}, {"title":"title 2"}]
{"title":"title 1"}
{"title":"title 2"}

Примітка. Якщо ви намагалися зателефонувати, JSONObject.parse(books.toString());ви отримаєте помилку:

java.io.IOException: Expecting '{' on line 1, column 2 instead, obtained token: 'Token: ['

1
Більш простий код може використовувати instanceof JSONArray проти instanceof JSONObject на об'єкті, поверненому з виклику get, щоб визначити, який клас слід використовувати для розбору об’єкта ...
Nathaniel Mills

5

ВЕБ-САЙТ JSON.ORG РОЗБІРАЄ ....

https://www.json.org/

На сайті чітко зазначено наступне:

JSON побудований на двох структурах:

  1. Колекція пар імен / значень. У різних мовах це реалізується як об'єкт, запис, структура, словник, хеш-таблиця, список клавіш або асоціативний масив.

  2. Впорядкований список значень. У більшості мов це реалізується як масив, вектор, список чи послідовність.

Це універсальні структури даних. Практично всі сучасні мови програмування підтримують їх у тій чи іншій формі. Має сенс, що формат даних, який взаємозамінний з мовами програмування, також повинен базуватися на цих структурах. У JSON вони приймають такі форми:

ОБ'ЄКТ:

Об'єкт - це не упорядкований набір пар імен / значення. Об'єкт починається з {(ліва дужка) і закінчується з} (права дужка). Кожне ім’я супроводжується: (двокрапка), а пари імен / значень розділені знаком ((кома).

{string: value, string: value}

ПРОСТО:

Масив - це упорядкована колекція значень. Масив починається з [(ліва дужка) і закінчується з] (права дужка). Значення розділені знаком, (кома).

[value, value, value ….]

VALUE:

Значенням може бути рядок у подвійних лапки, або число, істинне, неправдиве, або нульове, або об'єкт або масив. Ці структури можуть вкладатись.

STRING:

Рядок - це послідовність нульових або більше символів Unicode, загорнутих у подвійні лапки, використовуючи зворотні риски. Символ представлений у вигляді одного символьного рядка. Рядок дуже схожий на струну C або Java.

НОМЕР:

Число дуже схоже на номер C або Java, за винятком того, що восьмеричний і шістнадцятковий формати не використовуються.

ПРО БІЛОМ:

Пробіл можна вставити між будь-якою парою жетонів. За винятком кількох деталей кодування, які повністю описують мову.


Добре з прикладами; це допомогло мені закінчити написання мого тесту для валідатора JSON. Я не був впевнений, що мається на увазі під рядком (наприклад, це повинна бути рядок всередині подвійних лапок).
gimlichael

Я бачу, як це можна переплутати, пропозиція могла бути трохи більш стислим, починаючи так: "Послідовність нульових чи більше символів Unicode ...." Я вважаю, що автор, можливо, додав це для наголосу. Я виклав це таким чином, щоб було легше бачити деякі ключові моменти. Хоча я запізнілий відповідь, я сподіваюся, що це додасть ясності, якщо потрібно.
Дж. Морено
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.