262 votes

JSON peut-il commencer par "[" ?

De ce que je peux lire sur json.org toutes les chaînes JSON doivent commencer par l'expression { (accolade), et [ Les caractères (crochets) représentent un élément de tableau en JSON.

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

1 votes

(Il existe apparemment plusieurs bibliothèques JSON mal conçues qui vous obligent à connaître le type JSON le plus externe. La solution la plus simple ici est d'entourer la chaîne JSON de [] , l'analyse comme un tableau, et prend le premier élément du tableau).

2 votes

Apparemment, il est plus sûr de le faire commencer par { et non par [ afin qu'il ne soit pas un tableau Javascript valide et qu'il ne puisse pas être utilisé pour des attaques CSRF.

304voto

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

JSON est construit sur deux structures :

  • Une collection de paires nom/valeur. Dans divers langages, ceci est réalisé comme un objet, un enregistrement, struct, dictionnaire, table de hachage, liste de clés, ou tableau associatif.
  • Une liste ordonnée de valeurs. Dans la plupart des langages, elle est réalisée sous la forme d'un
    tableau, vecteur, liste ou séquence.

Il décrit ensuite les deux structures comme suit : A JSON objectA JSON array

Notez que les caractères de début et de fin sont respectivement des crochets et des parenthèses.

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

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

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

Mise à jour (2014)

Depuis mars 2014, il existe une nouvelle RFC JSON ( 7159 ) qui modifie légèrement la définition (voir pages 4/5).

La définition selon la RFC 4627 était : JSON-text = object / array

Ceci a été modifié dans le RFC 7159 en : JSON-text = ws value ws

ws représente les espaces blancs et value est défini comme suit :

Une valeur JSON DOIT être un objet, un tableau, un nombre ou une chaîne de caractères, ou l'un des éléments suivants les trois noms littéraux suivants :

false null true

Donc, la réponse à la question est toujours oui, le texte JSON peut commencer par un crochet (c.-à-d. false , null o true .

En outre, cela a changé par rapport à ma précédente citation du RFC 4627 (c'est nous qui soulignons) :

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

Un texte JSON est un texte sérialisé valeur . Notez que certaines spécifications antérieures de spécifications précédentes de JSON contraignaient un texte JSON à être un objet ou un tableau. tableau. Les implémentations qui génèrent uniquement des objets ou des tableaux lorsqu'un texte JSON est demandé, seront interopérables dans le sens où toutes les implémentations implémentations les accepteront comme des textes JSON conformes.

0 votes

Merci, j'ai regardé cette figure plusieurs fois, apparemment il y a un problème avec la bibliothèque json4j, qui n'aime pas un json avec [.

1 votes

@Tiberiu Hajas : J'ai mis un peu de temps à le comprendre quand je l'ai découvert. Mais après avoir vu quelques exemples de JSON et les avoir comparés, j'aime vraiment comment ils l'ont fait. En ce qui concerne json4j, vous pouvez peut-être soumettre un rapport de bogue à l'administrateur de la bibliothèque json4j. créateur .

0 votes

Je suis probablement en retard pour la fête. Mais ce que j'ai trouvé dans la RFC 8259 dit qu'un texte JSON est un se

12voto

Nathaniel Mills Points 101

Si la chaîne de caractères que vous analysez commence par une accolade gauche ([) vous pouvez utiliser JSONArray.parse pour récupérer un objet JSONArray et ensuite vous pouvez utiliser get(i) donde i est un indice de 0 à la valeur de l'élément JSONArray retourné. 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();
      }
   }
}

Ce qui a produit des résultats 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"}

Remarque : si vous avez tenté 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: ['

2 votes

Un code plus simple pourrait utiliser instanceof JSONArray ou instanceof JSONObject sur l'objet renvoyé par l'appel get pour déterminer quelle classe doit être utilisée pour analyser l'objet...

10voto

J. Moreno Points 131

LE SITE JSON.ORG INDIQUE ....

https://www.json.org/

Le site indique clairement ce qui suit :

JSON est construit sur deux structures :

  1. Une collection de paires nom/valeur. Dans divers langages, cela est comme un objet, un enregistrement, une structure, un dictionnaire, une table de hachage, une liste liste de clés, ou tableau associatif.

  2. Une liste ordonnée de valeurs. Dans la plupart des langages, cela se traduit par un tableau, un vecteur, une liste ou une séquence.

Ce sont des structures de données universelles. Pratiquement tous les langages de programmation modernes les prennent en charge sous une forme ou une autre. Il est logique qu'un format de données interchangeable avec les langages de programmation soit également basé sur ces structures. Dans JSON, elles prennent ces formes :

OBJET :

Un objet est un ensemble non ordonné de paires nom/valeur. Un objet commence par { (accolade gauche) et se termine par } (accolade droite). (accolade droite). Chaque nom est suivi de : (deux points) et les couples nom/valeur sont séparés par , (virgule).

{string: value, string: value}

ARRAY :

Un tableau est une collection ordonnée de valeurs. Un tableau commence par [ (crochet gauche) et se termine par ] (crochet droit). Les valeurs sont séparées par , (virgule).

[value, value, value ….]

VALEUR :

Une valeur peut être une chaîne de caractères entre guillemets, ou un nombre, ou vrai ou faux ou nul, ou un objet ou un tableau. Ces structures peuvent être imbriquées.

STRING :

Une chaîne de caractères est une séquence de zéro ou plusieurs caractères Unicode, entourée de guillemets doubles, avec des antislashs. A

NUMÉRO :

Un nombre ressemble beaucoup à un nombre C ou Java, sauf que les formats octal et hexadécimal ne sont pas utilisés.

À PROPOS DES ESPACES BLANCS :

Des espaces blancs peuvent être insérés entre n'importe quelle paire de mots. À l'exception de quelques détails d'encodage, cela décrit complètement le langage.

1voto

Arin Yazilim Points 121

La réponse courte est SI

Dans un fichier .json, vous pouvez placer des nombres (même seulement 10), des chaînes de caractères (même seulement "hello"), des booléens (vrai, faux), des nuls (même seulement null), des tableaux et des objets. https://www.json.org/json-en.html

Il n'est pas logique d'utiliser uniquement des nombres, des chaînes de caractères, des booléens et des nuls, car dans les fichiers .jon, nous utilisons des données structurées plus complexes comme les tableaux et les objets (le plus souvent des versions imbriquées).

Vous trouverez ci-dessous un exemple de données JSON avec un tableau d'objets commençant par "[". https://jsonplaceholder.typicode.com/posts

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X