Подтвердить что ты не робот

Может ли JSON начать с "["?

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

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

4b9b3361

Ответ 1

JSON может быть либо массивом, либо объектом. В частности, от json.org:

JSON построен на двух структурах:

  • Коллекция пар имя/значение. На разных языках это реализованный как объект, запись, struct, dictionary, хеш-таблица, ключевой список или ассоциативный массив.
  • Упорядоченный список значений. На большинстве языков это реализуется как массив, вектор, список или последовательность.

Далее описываются две структуры: A JSON objectA JSON array

Обратите внимание, что начальные и конечные символы являются фигурными скобками и квадратными скобками соответственно.

Edit
И отсюда: 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.

Ответ 2

Если строка, которую вы обрабатываете, начинается с левой скобки ([), вы можете использовать JSONArray.parse, чтобы вернуть объект JSONArray, а затем вы можете использовать get(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: ['

Ответ 3

JSON.ORG ВЕБ-САЙТ ГОВОРИТ....

https://www.json.org/

На сайте четко указано следующее:

JSON построен на двух структурах:

  1. Коллекция пар имя/значение. На разных языках это реализуется как объект, запись, структура, словарь, хеш-таблица, список клавиш или ассоциативный массив.

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

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

ОБЪЕКТ:

Объектом является неупорядоченный набор пар имя/значение. Объект начинается с {(левая скобка) и заканчивается на} (правая фигурная скобка). За каждым именем следует: (двоеточие), а пары имя/значение разделяются запятой.

{string: value, string: value}

ARRAY:

Массив - это упорядоченный набор значений. Массив начинается с [(левая скобка) и заканчивается на] (правая скобка). Значения разделяются запятой.

[value, value, value ….]

ЗНАЧЕНИЕ:

Значение может быть строкой в двойных кавычках, или числом, или истинным или ложным или нулевым, или объектом или массивом. Эти структуры могут быть вложенными.

STRING:

Строка представляет собой последовательность из нуля или более символов Юникода, заключенных в двойные кавычки, с использованием обратных слэшей. Символ представляется как одна символьная строка. Строка очень похожа на строку C или Java.

ЧИСЛО:

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

О WHITESPACE:

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