validator - O JSON pode começar com “[”?




json xml (2)

JSON pode ser uma matriz ou um objeto. 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 objeto, registro, estrutura, dicionário, tabela de hash, lista de chaves ou matriz de associação.
  • 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:

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 objeto 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 objeto, 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 objetos e matrizes, agora também pode ser um número, string ou os valores false , null ou true .

Além disso, isso mudou em relação à 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 objeto ou uma matriz. Implementações que geram apenas objetos ou matrizes para as quais um texto JSON é chamado serão interoperáveis ​​no sentido de que todas as implementações aceitarão estes como textos JSON em conformidade.

Pelo que 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 entrada que começa com [ , então 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 iniciar com [ , ou que ele só pode começar com { .


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

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






json