Por lo que puedo leer en json.org , todas las cadenas JSON deben comenzar con {
(llave), y los [
caracteres (corchetes) representan un elemento de matriz en JSON.
Uso la json4j
biblioteca y recibí una entrada que comienza con [
, así que no pensé que fuera JSON válido. Miré brevemente el esquema JSON, pero realmente no pude encontrar que indicaba que un archivo JSON no puede comenzar [
, o que solo puede comenzar {
.
Respuestas:
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 con clave o matriz asociativa.
- Una lista ordenada de valores. En la mayoría de los idiomas, esto se realiza como una
matriz, vector, lista o secuencia.
Luego continúa describiendo las dos estructuras como:
Tenga en cuenta que los caracteres iniciales y finales son llaves 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 o conjunto serializado.
Actualización (2014)
A partir de marzo de 2014, hay un nuevo JSON RFC ( 7159 ) que modifica ligeramente la definición (consulte las páginas 4/5).
La definición según 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 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 los objetos y las matrices, ahora también puede ser un número, una cadena o los valores false
, null
o true
.
Además, esto ha cambiado desde mi cita anterior 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 anteriores de JSON restringieron un texto JSON para ser un objeto o una matriz. Las implementaciones que generan solo objetos o matrices donde se requiere un texto JSON serán interoperables en el sentido de que todas las implementaciones aceptarán estos como textos JSON conformes.
JSON-text = ws value ws
donde "Un valor JSON DEBE ser un objeto, matriz, número o cadena, o uno de los siguientes tres nombres literales: falso, nulo, verdadero "según la Sección 3 (Valores). Su ejemplo no satisface esas restricciones y, por lo tanto, no es JSON válido.
Respuestas:
Si la cadena que está analizando comienza con una llave izquierda ([), puede usarla JSONArray.parse
para recuperar un objeto JSONArray y luego puede usar get(i)
donde i es un índice de 0 a través de los JSONArray devueltos 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 JSONObject.parse(books.toString());
, obtendría el error que encontró:
java.io.IOException: Expecting '{' on line 1, column 2 instead, obtained token: 'Token: ['
fuente
EL SITIO WEB JSON.ORG DICE ...
El sitio establece claramente lo siguiente:
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 con clave o matriz asociativa.
Una lista ordenada de valores. En la mayoría de los idiomas, esto se realiza como una matriz, vector, lista o secuencia.
Estas son estructuras de datos universales. Prácticamente todos los lenguajes de programación modernos los admiten de una forma u otra. Tiene sentido que un formato de datos que sea intercambiable con lenguajes de programación también se base en estas estructuras. En JSON, toman estas formas:
OBJETO:
Un objeto es un conjunto desordenado de pares de nombre / valor. Un objeto comienza con {(llave izquierda) y termina con} (llave derecha). Cada nombre es seguido por: (dos puntos) y los pares de nombre / valor están separados por, (coma).
{string: value, string: value}
FORMACIÓN:
Una matriz es una colección ordenada de valores. Una matriz comienza con [(corchete izquierdo) y termina con] (corchete derecho). Los valores están separados por, (coma).
[value, value, value ….]
VALOR:
Un valor puede ser una cadena entre comillas dobles, o un número, o verdadero o falso o nulo, o un objeto o una matriz. Estas estructuras pueden estar anidadas.
CUERDA:
Una cadena es una secuencia de cero o más caracteres Unicode, entre comillas dobles, usando escapes de barra invertida. Un carácter se representa como una cadena de caracteres única. Una cadena es muy parecida a una cadena C o Java.
NÚMERO:
Un número es muy parecido a un número C o Java, excepto que los formatos octal y hexadecimal no se usan.
ACERCA DE WHITESPACE:
Se puede insertar un espacio en blanco entre cualquier par de tokens. Exceptuando algunos detalles de codificación, que describe completamente el idioma.
fuente
[]
, analizarla como una matriz y tomar el primer elemento de la matriz).