¿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 {.

 121
Author: Matthew, 2011-02-17

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: Un objeto JSONUna matriz JSON

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.

 151
Author: Richard Marskell - Drackir,
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: ['
 4
Author: Nathaniel Mills,
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