¿Puede JSON empezar con" ["?
De lo que puedo leer en json.org , todas las cadenas JSON deben comenzar con {
(corsé rizado), y [
caracteres (corchetes cuadrados) representan un elemento de matriz en JSON.
Utilizo la biblioteca json4j
, y obtuve una entrada que comienza con [
, así que no pensé que esto fuera JSON válido. Miré brevemente el esquema JSON, pero realmente no pude encontrar que decía que un archivo JSON no puede comenzar con [
, o que solo puede comenzar con {
.
2 answers
JSON puede ser un array o un objeto. Específicamente fuera de json.org:
JSON se basa en dos estructuras:
- Una colección de pares nombre/valor. En varios idiomas, esto es realizado como un objeto, grabar, struct, diccionario, tabla hash, lista con 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.
Entonces continúa describiendo las dos estructuras como:
Tenga en cuenta que los caracteres iniciales y finales son corchetes y corchetes respectivamente.
Editar
Y de aquí: http://www.ietf.org/rfc/rfc4627.txt
Un texto JSON es una secuencia de tokens. El conjunto de fichas 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, hay un nuevo JSON RFC (7159) esto modifica ligeramente la definición (véanse las páginas 4 y 5).
La definición por RFC 4627 fue: JSON-text = object / array
Esto se ha cambiado en RFC 7159 a: JSON-text = ws value ws
Donde ws
representa el espacio en blanco y 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 literales nombres:
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
.
También, esto ha cambiado de mi cita anterior del RFC 4627 (énfasis añadido):
Un texto JSON es una secuencia de tokens. El conjunto de fichas incluye seis caracteres estructurales, cadenas, números y tres nombres literales.
Un texto JSON es un valor serializado . Tenga en cuenta que ciertos anteriores especificaciones de JSON restringieron un texto JSON para ser un objeto o un matriz. Implementaciones que generan solo objetos o matrices donde un Texto JSON se pide será interoperable en el sentido de que todos las implementaciones aceptarán estos como textos JSON conformes.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-23 19:51:15
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 desde 0 hasta el size()-1
de JSONArray devuelto.
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 una salida 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 intentas llamar a JSONObject.parse(books.toString());
obtendrás el error que encontraste:
java.io.IOException: Expecting '{' on line 1, column 2 instead, obtained token: 'Token: ['
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-18 20:24:22