Может ли JSON начинаться с "["? - PullRequest
145 голосов
/ 17 февраля 2011

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

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

Ответы [ 3 ]

180 голосов
/ 17 февраля 2011

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

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

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

Затем он описывает две структуры как: A JSON object A JSON array

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

Редактировать
И отсюда: http://www.ietf.org/rfc/rfc4627.txt

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

Текст JSON представляет собой сериализованный объект или массив.

Обновление (2014)

По состоянию на март 2014 года появился новый RFC JSON ( 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.

5 голосов
/ 18 июня 2012

Если строка, которую вы анализируете, начинается с левой фигурной скобки ([), вы можете использовать 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 голос
/ 05 декабря 2018

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

https://www.json.org/

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

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

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

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

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

ОБЪЕКТ:

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

{string: value, string: value}

ARRAY:

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

[value, value, value ….]

VALUE:

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

СТРОКА:

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

НОМЕР

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

О БЕЛОМ ПРОСТРАНСТВЕ:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...