O JSON pode começar com “[”?

Pelo que eu posso ler no json.org , todas as strings JSON devem começar com { (chaves), e [ caracteres (colchetes) representam um elemento da matriz em JSON.

Eu uso a biblioteca json4j , e recebi uma input que começa com [ , então eu não achei que fosse um JSON válido. Eu olhei rapidamente para o esquema JSON, mas não consegui realmente dizer que um arquivo JSON não pode começar com [ , ou que ele só pode começar com { .

JSON pode ser uma matriz ou um object. Especificamente, fora do json.org:

O JSON é construído em duas estruturas:

  • Uma coleção de pares nome / valor. Em vários idiomas, isso é realizado como um object, registro, estrutura, dictionary, tabela de hash, lista com chave ou matriz associativa.
  • Uma lista ordenada de valores. Na maioria das linguagens, isso é percebido como um
    matriz, vetor, lista ou sequência.

Em seguida, ele descreve as duas estruturas como: Um objeto JSONUm array JSON

Observe que os caracteres inicial e final são chaves e colchetes, respectivamente.

Editar
E daqui: http://www.ietf.org/rfc/rfc4627.txt

Um texto JSON é uma sequência de tokens. O conjunto de tokens inclui seis caracteres estruturais, strings, números e três nomes literais.

Um texto JSON é um object serializado ou matriz.

Atualização (2014)

Em março de 2014, há um novo JSON RFC ( 7159 ) que modifica ligeiramente a definição (consulte as páginas 4/5).

A definição por RFC 4627 foi: JSON-text = object / array

Isso foi alterado no RFC 7159 para: JSON-text = ws value ws

Onde ws representa espaço em branco e o value é definido da seguinte forma:

Um valor JSON DEVE ser um object, matriz, número ou string, ou um dos três nomes literais a seguir:

 false null true 

Então, a resposta para a pergunta ainda é sim, o texto JSON pode começar com um colchete (ou seja, uma matriz). Mas, além de objects e matrizes, agora também pode ser um número, string ou os valores false , null ou true .

Além disso, isso mudou da minha citação anterior da RFC 4627 (grifo nosso):

Um texto JSON é uma sequência de tokens. O conjunto de tokens inclui seis caracteres estruturais, strings, números e três nomes literais.

Um texto JSON é um valor serializado. Observe que determinadas especificações anteriores de JSON restringiram um texto JSON a ser um object ou uma matriz. Implementações que geram apenas objects ou matrizes para as quais um texto JSON é chamado serão interoperáveis ​​no sentido de que todas as implementações os aceitarão como textos JSON em conformidade.

Se a string que você está analisando começar com uma chave esquerda ([), você pode usar JSONArray.parse para recuperar um object JSONArray e, em seguida, usar get(i) onde i é um índice de 0 até o size()-1 de JSONArray retornado 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(); } } } 

Que produziu saída como:

 {"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"} 

Nota: se você tentou chamar JSONObject.parse(books.toString()); você receberia o erro que encontrou:

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