Premiers pas avec JSON

Tableau JSON

Un tableau JSON est une collection ordonnée de valeurs. Il est entouré d’accolades, c’est-à-dire [], et les valeurs sont délimitées par des virgules :

{ "colors" : [ "red", "green", "blue" ] }

Les tableaux JSON peuvent également contenir n’importe quel élément JSON valide, y compris des objets, comme dans cet exemple de tableau avec 2 objets (extrait du document RFC) :

[
  {
     "precision": "zip",
     "Latitude":  37.7668,
     "Longitude": -122.3959,
     "Address":   "",
     "City":      "SAN FRANCISCO",
     "State":     "CA",
     "Zip":       "94107",
     "Country":   "US"
  },
  {
     "precision": "zip",
     "Latitude":  37.371991,
     "Longitude": -122.026020,
     "Address":   "",
     "City":      "SUNNYVALE",
     "State":     "CA",
     "Zip":       "94085",
     "Country":   "US"
  }
]

Ils peuvent également contenir des éléments de types mixtes, par exemple :

[
    "red",
    51,
    true,
    null,
    {
        "state": "complete"
    }
]

Une erreur courante lors de l’écriture de tableaux JSON (et d’objets) consiste à laisser une virgule après le dernier élément. Il s’agit d’un modèle courant dans de nombreux langages, mais malheureusement, il n’est pas valide dans JSON. Par exemple, le tableau suivant n’est pas valide :

[
    1,
    2,
]

Pour que cela soit valide, vous devez supprimer la virgule après le dernier élément, en la transformant en :

[
    1,
    2
]

Objet JSON

Un objet JSON est entouré d’accolades et contient des paires clé-valeur.

{ "key1": "value1", "key2": "value2", ... }

Les clés doivent être des chaînes valides, donc entourées de guillemets doubles. Les valeurs peuvent être des objets JSON, des nombres, des chaînes, des tableaux ou l’un des ’noms littéraux’ suivants : false, null ou true. Dans une paire clé-valeur, la clé est séparée de la valeur par deux-points. Plusieurs paires clé-valeur sont séparées par des virgules.

L’ordre dans les objets n’est pas important. L’objet JSON suivant est donc équivalent à ce qui précède :

{ "key2": "value2", "key1": "value1", ... }

Pour résumer, voici un exemple d’objet JSON valide :

{
  "image": {
    "width":  800,
    "height": 600,
    "title":  "View from 15th Floor",
    "thumbnail": {
      "url": "http://www.example.com/image/481989943",
      "height": 125,
      "width":  100
    },
    "visible": true,
    "ids": [116, 943, 234, 38793]
  }
}

Exemples courants d’objets JSON, avec des équivalents d’objets (Java) associés

Tout au long de cet exemple, on suppose que l’objet ‘root’ sérialisé en JSON est une instance de la classe suivante :

public class MyJson {
}

 

Exemple 1 : Un exemple d’instance de MyJson, tel quel :

{}

c’est-à-dire que puisque la classe n’a pas de champs, seules les accolades sont sérialisées. Les accolades sont les délimiteurs courants pour représenter un objet. Remarquez aussi que l’objet racine n’est pas sérialisé sous forme de paire clé-valeur. Ceci est également vrai pour les types simples (chaîne, nombres, tableaux) lorsqu’ils ne sont pas des champs d’un objet (externe).

 

Exemple 2 : Ajoutons quelques champs à MyJson et initialisons-les avec quelques valeurs :

// another class, useful to show how objects are serialized when inside other objects
public class MyOtherJson {} 

// an enriched version of our test class
public class MyJson {
  String myString = "my string";
  int myInt = 5;
  double[] myArrayOfDoubles = new double[] { 3.14, 2.72 };
  MyOtherJson objectInObject = new MyOtherJson();    
}

Voici la représentation JSON associée :

{
  "myString" : "my string",
  "myInt" : 5,
  "myArrayOfDoubles" : [ 3.14, 2.72 ],
  "objectInObject" : {}
}

Remarquez comment tous les champs sont sérialisés dans une structure clé-valeur, où la clé est le nom du champ contenant la valeur. Les délimiteurs courants pour les tableaux sont les crochets. Notez également que chaque paire clé-valeur est suivie d’une virgule, à l’exception de la dernière paire.

Édition JSON à la main

JSON est un format très strict (voir http://json.org). Cela facilite l’analyse et l’écriture pour les machines, mais surprend les humains lorsqu’une erreur discrète casse le document.

Problèmes communs

Virgule de fin

Contrairement à la plupart des langages de programmation, vous n’êtes pas autorisé à ajouter une virgule à la fin :

{
  a: 1,
  b: 2,
  c: 3
}

L’ajout d’une virgule après ‘3’ produira une erreur de synaxe.

Le même problème existe pour les tableaux :

[ 
  1,
  2
]

Vous devez prendre des précautions supplémentaires si vous devez commander à nouveau les articles.

Virgule manquante

{
  a: 1,
  b: 2,
  c: 3
  d: 4
}

Puisque les virgules de fin ne sont pas autorisées, il est facile d’oublier d’en ajouter une avant d’ajouter une nouvelle valeur (dans ce cas après ‘3’).

Commentaires

JSON n’autorise pas les commentaires car il s’agit d’un format d’échange de données. C’est toujours un sujet brûlant mais sans réponses claires autres que de ne pas les utiliser.

Il existe plusieurs solutions :

  • Utilisez des commentaires de style C, puis supprimez-les avant de les transmettre à l’analyseur
  • Intégrer des commentaires dans les données
{
  "//": "comment",
  "data": 1
}
  • Intégrez des commentaires et écrasez-les avec des données
{
  "data": "comment",
  "data": 1
}

La deuxième entrée data écrasera le commentaire dans la plupart des analyseurs.

Solutions

Pour faciliter l’écriture de JSON, utilisez un IDE qui vérifie les erreurs de syntaxe et fournit une coloration de la syntaxe. Des plugins sont disponibles pour la plupart des éditeurs.

Lorsque vous développez des applications et des outils, utilisez JSON en interne et en tant que protocole, mais essayez de ne pas l’exposer dans des endroits où un humain serait probablement obligé de le modifier à la main (sauf pour le débogage).

Évaluez d’autres formats mieux adaptés à cet usage, comme :

  • Hjson, peut être facilement converti vers et depuis JSON
  • TOML, similaire aux fichiers INI
  • YAML, plus de fonctionnalités mais au prix d’une complexité accrue

Règles de syntaxe JSON

La syntaxe JSON (JavaScript Object Notation) est basée sur un sous-ensemble de JavaScript (voir aussi json.org).

Une expression JSON valide peut être l’un des types de données suivants

  • types de données simples : Chaîne, Nombre, Booléen, Null
  • types de données composites : valeur, objet, tableau

Types de données simples

Une chaîne JSON doit être entourée de guillemets doubles et peut contenir zéro ou plusieurs caractères Unicode ; les échappements par contre-oblique sont autorisés. Les numéros JSON acceptés sont en notation E. Booléen est l’un des vrai, faux. Null est le mot-clé réservé null.

Type de données Exemples de JSON valides
### Chaîne "pomme"
"Pomme"
"\u00c4pfel\n"
""
### Numéro ‘3’
1.4
-1.5e3
### Booléen vrai
faux
### Nul null

Types de données composites

Évaluer

Une valeur JSON peut être l’une des suivantes : Chaîne, Nombre, Booléen, Null, Objet, Tableau.

Objet

Un objet JSON est une collection non ordonnée séparée par des virgules de paires nom:valeur entre accolades où nom est une chaîne et valeur une valeur JSON.

Déployer

Un tableau JSON est une collection ordonnée de valeurs JSON.

Exemple de tableau JSON :

["home", "wooden"]

Exemples d’objets JSON :

{
    "id": 1,
    "name": "A wooden door",
    "price": 12.50,
    "tags": ["home", "wooden"]
}

[
  1,
  2,
  [3, 4, 5, 6],
  {
    "id": 1,
    "name": "A wooden door",
    "price": 12.50,
    "tags": ["home", "wooden"]
  }
]

Outils en ligne pour valider et formater les données JSON :

  • http://jsonlint.com/
  • http://www.freeformatter.com/json-validator.html
  • http://jsonviewer.stack.hu/
  • http://json.parser.online.fr/

Justification de Array vs Object (c’est-à-dire quand utiliser quoi)

Les tableaux JSON représentent une collection d’objets. Dans JS, il existe un tas de fonctions de collecte telles que slice, pop, push. Les objets ont juste plus de données brutes.

Un JSONArray est une séquence ordonnée de valeurs. Sa forme de texte externe est une chaîne entourée de crochets avec des virgules séparant les valeurs.

Un JSONObject est une collection non ordonnée de paires nom/valeur. Sa forme externe est une chaîne entourée d’accolades avec des deux-points entre les noms et les valeurs, et des virgules entre les valeurs et les noms.

Objet - clé et valeur, Array - chiffres, chaînes, booléens. Quand utilisez-vous ceci ou cela ?

Vous pouvez considérer les tableaux comme “est un/un” et les objets comme “a un”. Prenons “Fruit” comme exemple. Chaque élément de la gamme de fruits est un type de fruit.

fruits du tableau : [orange, mangue, banane]

Les tableaux peuvent contenir des objets, des chaînes, des nombres, des tableaux, mais ne traitons que des objets et des tableaux.

array fruit : [orange:[], mango:{}, banana:{}]

. Vous pouvez voir que l’orange est aussi un tableau. Cela implique que tout élément qui entre dans l’orange est un type d’orange, disons : bitter_orange, mandarin, sweet_orange.

pour l’objet fruit, tout élément qu’il contient est un attribut de fruit. ainsi le fruit a une

object fruit :{seed:{}, endocarp:{},flesh:{}}

Cela implique également que tout ce qui se trouve dans l’objet graine doit être la propriété de la graine, par exemple : la couleur, ..

JSON est avant tout un langage qui permet de sérialiser des objets javascript en chaînes. Ainsi, lors de la désérialisation d’une chaîne JSON, vous devriez obtenir une structure d’objet javascript. Si votre json se désérialise en un objet qui stocke 100 objets appelés object1 à object100, cela va être très gênant. La plupart des désérialiseurs s’attendent à ce que vous disposiez d’objets connus et de tableaux d’objets connus afin qu’ils puissent convertir les chaînes en la structure d’objet réelle dans le langage que vous utilisez. C’est aussi une question à laquelle la philosophie de la conception orientée objet vous répondrait.

crédits à tous les participants http://stackoverflow.com/questions/12288820/what-are-the-differences-between-using-json-arrays-vs-json-objects/37646227#37646227