JSON peut commencer par" ["?

D'après ce que je peux lire sur json.org , toutes les chaînes de JSON doivent commencer par { (broche bouclée), et les caractères [ (crochets) représentent un élément de tableau dans JSON.

j'utilise la bibliothèque json4j , et j'ai eu une entrée qui commence par [ , donc je ne pensais pas que c'était JSON valide. J'ai regardé brièvement le schéma JSON, mais je n'ai pas vraiment trouvé qu'il indiquait qu'un fichier JSON ne pouvait pas commencer avec [ , ou qu'elle ne peut commencer qu'avec { .

121
demandé sur Matthew 2011-02-17 23:46:42

2 réponses

JSON peut être soit un tableau, soit un objet. Spécifiquement hors de json.org:

JSON est construit sur deux structures:

  • Une collection de paires nom/valeur. Dans plusieurs langues, c'est réalisé comme un objet, enregistrer, structure, dictionnaire, table de hachage, liste de touches, ou tableau associatif.
  • une liste de valeurs ordonnée. Dans la plupart des langues, Ceci est réalisé comme un

    tableau, vecteur, liste ou séquence.

il décrit ensuite les deux structures comme: A JSON object A JSON array

noter que les caractères de début et de fin sont les crochets et les crochets respectivement.

Modifier

Et d'ici: http://www.ietf.org/rfc/rfc4627.txt

un texte JSON est une séquence de jetons. L'ensemble des jetons comprend six caractères structurels, chaînes, des nombres, et trois noms littéraux.

un texte JSON est un objet ou tableau sérialisé.

mise à Jour (2014)

en date de Mars 2014, il ya une nouvelle JSON RFC ( 7159 ) qui modifie la définition légèrement (voir pages 4 et 5).

la définition figurant dans la RFC 4627 était la suivante: JSON-text = object / array

dans la RFC 7159, cette valeur a été remplacée par JSON-text = ws value ws

ws représente un espace et value est défini comme suit:

une valeur JSON doit être un objet, un tableau, un nombre ou une chaîne, ou l'un des les trois noms littéraux suivants:

false null true

donc, la réponse à la question est toujours oui, JSON texte peut commencer par un crochet (i.e. un tableau). Mais en plus des objets et des tableaux, il peut maintenant être aussi un nombre, une chaîne ou les valeurs false , null ou true .

aussi, cela a changé de ma citation précédente RFC 4627 (italique ajouté):

un texte JSON est une séquence de jetons. L'ensemble des jetons comprend six caractères structurels, chaînes, des nombres, et trois noms littéraux.

UN JSON texte est sérialisé valeur . Notez que certains précédents les spécifications de JSON ont contraint un texte JSON à être un objet ou un tableau. Les implémentations qui ne génèrent que des objets ou des tableaux Le texte de JSON est appelé à être interopérable en ce sens que tous les les implémentations accepteront ces textes JSON comme conformes.

151
répondu Richard Marskell - Drackir 2014-12-23 19:51:15

si la chaîne que vous analysez commence par une attache gauche ([) vous pouvez utiliser JSONArray.parse pour récupérer un objet JSONArray et ensuite vous pouvez utiliser get(i) i est un index de 0 à travers le size()-1 de JSONArray retourné .

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();
      }
   }
}

qui a produit une sortie comme:

{"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"}

Note: Si vous avez essayé d'appeler JSONObject.parse(books.toString()); vous obtiendriez l'erreur que vous avez rencontrée:

java.io.IOException: Expecting '{' on line 1, column 2 instead, obtained token: 'Token: ['
4
répondu Nathaniel Mills 2012-06-18 20:24:22