Pelo que posso ler no json.org , todas as strings JSON devem começar com {
(chaves) e os [
caracteres (colchetes) representam um elemento da matriz no JSON.
Eu uso a json4j
biblioteca e recebi uma entrada que começa com [
, então não achei que isso fosse JSON válido. Examinei brevemente o esquema JSON, mas não consegui encontrá-lo, afirmando que um arquivo JSON não pode ser iniciado [
ou apenas pode ser iniciado {
.
Respostas:
JSON pode ser uma matriz ou um objeto. Especificamente fora do json.org:
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 associativa.
- Uma lista ordenada de valores. Na maioria dos idiomas, isso é realizado como uma
matriz, vetor, lista ou sequência.
Em seguida, descreve as duas estruturas como:
Observe que os caracteres inicial e final são colchetes e colchetes, respectivamente.
Editar
E a partir daqui: http://www.ietf.org/rfc/rfc4627.txt
Um texto JSON é uma sequência de tokens. O conjunto de tokens inclui seis caracteres estruturais, cadeias, números e três nomes literais.
Um texto JSON é um objeto ou matriz serializada.
Atualização (2014)
Em março de 2014, existe um novo JSON RFC ( 7159 ) que modifica ligeiramente a definição (consulte as páginas 4/5).
A definição de acordo com a 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 value
é definido da seguinte maneira:
Um valor JSON DEVE ser um objeto, matriz, número ou string ou um dos três nomes literais a seguir:
false null true
Portanto, 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, sequência ou valores false
, null
ou true
.
Além disso, isso foi alterado em relação à minha citação anterior do RFC 4627 (ênfase adicionada):
Um texto JSON é uma sequência de tokens. O conjunto de tokens inclui seis caracteres estruturais, cadeias, números e três nomes literais.
Um texto JSON é um valor serializado . Observe que certas especificações anteriores do JSON restringiam um texto JSON a ser um objeto ou uma matriz. As implementações que geram apenas objetos ou matrizes nas quais um texto JSON é solicitado serão interoperáveis no sentido de que todas as implementações os aceitarão como textos JSON em conformidade.
JSON-text = ws value ws
onde "Um valor JSON DEVE ser um objeto, matriz, número ou string, ou um dos três nomes literais a seguir: falso, nulo, verdadeiro "de acordo com a Seção 3 (Valores). Seu exemplo não satisfaz essas restrições e, portanto, não é um JSON válido.
Respostas:
Se a string que você está analisando começa com uma chave esquerda ([), você pode usar JSONArray.parse
para recuperar um objeto JSONArray e então usar get(i)
onde i é um índice de 0 a 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ê tentar ligar JSONObject.parse(books.toString());
, receberá o erro que encontrou:
java.io.IOException: Expecting '{' on line 1, column 2 instead, obtained token: 'Token: ['
fonte
O WEBSITE JSON.ORG DIZ ....
O site afirma claramente o seguinte:
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 associativa.
Uma lista ordenada de valores. Na maioria dos idiomas, isso é realizado como uma matriz, vetor, lista ou sequência.
Essas são estruturas de dados universais. Praticamente todas as linguagens de programação modernas as suportam de uma forma ou de outra. Faz sentido que um formato de dados intercambiável com linguagens de programação também seja baseado nessas estruturas. No JSON, eles assumem as seguintes formas:
OBJETO:
Um objeto é um conjunto não ordenado de pares nome / valor. Um objeto começa com {(colchete esquerdo) e termina com} (colchete direito). Cada nome é seguido por: (dois pontos) e os pares nome / valor são separados por (vírgula).
{string: value, string: value}
ARRAY:
Uma matriz é uma coleção ordenada de valores. Uma matriz começa com [(colchete esquerdo) e termina com] (colchete direito). Os valores são separados por (vírgula).
[value, value, value ….]
VALOR:
Um valor pode ser uma cadeia de caracteres entre aspas duplas, ou um número, verdadeiro ou falso ou nulo, ou um objeto ou uma matriz. Essas estruturas podem ser aninhadas.
CORDA:
Uma sequência é uma sequência de zero ou mais caracteres Unicode, entre aspas duplas, usando escapes de barra invertida. Um caractere é representado como uma única sequência de caracteres. Uma string é muito parecida com uma string C ou Java.
NÚMERO:
Um número é muito parecido com um número C ou Java, exceto que os formatos octal e hexadecimal não são usados.
SOBRE ESPAÇO:
Espaço em branco pode ser inserido entre qualquer par de tokens. Exceto alguns detalhes de codificação, que descrevem completamente o idioma.
fonte
[]
, analisá-la como uma matriz e usar o primeiro elemento da matriz.)