¿JSON puede comenzar con “[“?

Según lo que puedo leer en json.org , todas las cadenas JSON deben comenzar con { (llave), y [ caracteres (corchetes) representan un elemento de la matriz en JSON.

Utilizo la biblioteca json4j , y obtuve una entrada que comienza con [ , así que no creo que esto sea JSON válido. Miré brevemente el esquema de JSON, pero no pude encontrarlo. Afirmó que un archivo JSON no puede comenzar con [ , o que solo puede comenzar con { .

JSON puede ser una matriz o un objeto. Específicamente fuera de json.org:

JSON se basa en dos estructuras:

  • Una colección de pares de nombre / valor. En varios idiomas, esto se realiza como un objeto, registro, estructura, diccionario, tabla hash, lista de claves o matriz asociativa.
  • Una lista ordenada de valores. En la mayoría de los idiomas, esto se realiza como un
    matriz, vector, lista o secuencia.

A continuación, describe las dos estructuras como: Un objeto JSONUna matriz JSON

Tenga en cuenta que los caracteres inicial y final son corchetes y corchetes, respectivamente.

Editar
Y desde aquí: http://www.ietf.org/rfc/rfc4627.txt

Un texto JSON es una secuencia de tokens. El conjunto de tokens incluye seis caracteres estructurales, cadenas, números y tres nombres literales.

Un texto JSON es un objeto serializado o matriz.

Actualización (2014)

A partir de marzo de 2014, existe un nuevo JSON RFC ( 7159 ) que modifica levemente la definición (ver páginas 4/5).

La definición por RFC 4627 fue: JSON-text = object / array

Esto ha sido cambiado en RFC 7159 a: JSON-text = ws value ws

Donde ws representa espacios en blanco y el value se define de la siguiente manera:

Un valor JSON DEBE ser un objeto, matriz, número o cadena, o uno de los siguientes tres nombres literales:

 false null true 

Entonces, la respuesta a la pregunta sigue siendo sí, el texto JSON puede comenzar con un corchete (es decir, una matriz). Pero además de objetos y matrices, ahora también puede ser un número, cadena o los valores false , null o true .

Además, esto ha cambiado desde mi anterior cita RFC 4627 (énfasis agregado):

Un texto JSON es una secuencia de tokens. El conjunto de tokens incluye seis caracteres estructurales, cadenas, números y tres nombres literales.

Un texto JSON es un valor serializado. Tenga en cuenta que ciertas especificaciones previas de JSON obligaban a un texto JSON a ser un objeto o una matriz. Las implementaciones que generan solo objetos o matrices en las que se solicita un texto JSON serán interoperables en el sentido de que todas las implementaciones aceptarán que se trata de textos JSON conformes.

Si la cadena que está analizando comienza con un paréntesis izquierdo ([) puede usar JSONArray.parse para recuperar un objeto JSONArray y luego puede usar get(i) donde i es un índice de 0 a través del size()-1 de JSONArray devuelto 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 produjo resultados 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: si intentó llamar a JSONObject.parse(books.toString()); obtendrías el error que encontraste:

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