JSON
Tous les langages modernes offrent aux développeurs la possibilité d’utiliser la program-
mation objet. Ce type de programmation consiste à manipuler des objets qui contiennent
des données structurées (stockées dans des propriétés) et des fonctions (appelées
méthodes). La programmation objet remplace le développement plus traditionnel, qui
s’appuie sur des appels de fonctions avec des paramètres d’entrée.
Un objet est associé à un type, appelé classe de l’objet, définissant la structure des pro-
priétés et ses fonctionnalités. Un objet, appelé instance, contient les données liées à la
structure.
Dans cette première partie, nous allons d’abord étudier les concepts importants de la
programmation objet. Imaginons l’instance monArticle, issue du type d’objet
Article, et contenant les propriétés suivantes :
Les propriétés
Une propriété est une donnée associée à un objet. La propriété possède un nom et sa
valeur, qui peut être une chaîne de caractères, un nombre, un booléen ou tout autre objet
JavaScript.
Une propriété est dite accessible en écriture s’il est possible de modifier sa valeur par
programmation.
Les méthodes
Une méthode est une fonction associée à un objet. Par exemple, la méthode log(valeur)
de window est la fonction qui affiche le paramètre valeur dans la console du navigateur.
Par abus de langage et simplification, méthode et fonction sont souvent synonymes.
Dans le corps de la méthode d’un objet, le mot clé this fait référence à l’objet en cours
de manipulation, c’est-à-dire celui sur lequel s’applique la méthode.
La notation pointée
Nous avons déjà utilisé partout la notation pointée dans les scripts d’exemple de ce cours.
Ainsi, le titre de la page contenu dans la balise <title> est accessible avec la notation
document.title.
Le JavaScript autorise aussi l’accès aux propriétés d’un objet par les crochets, comme s’il
s’agissait d’un tableau. Ainsi, la syntaxe document["title"] est fonctionnellement
équivalente à document.title.
Il est intéressant de noter que les méthodes des objets peuvent aussi être appelées par
la notation crochet. Vous pouvez donc afficher dans la console du navigateur le titre de la
page avec l’appel : console["log"](document.title);
La lisibilité de cette syntaxe n’est pas vraiment bonne. De plus, votre éditeur de texte
ne pourra pas procéder à la coloration syntaxique habituelle. Pourtant, l’accès aux
propriétés par les crochets peut être très pratique. Imaginons un objet qui possède
les propriétés montant1 à montantN et que nous devions en faire la somme. Avec
la notation pointée, nous n’avons pas le choix et nous devons coder la totalité de la
somme : var somme=obj.montant1+obj.montant2+ … +obj.montantN;
Les classes
En programmation objet classique, une classe est la définition de la structure d’un objet.
Le constructeur.
L’héritage
L’ héritage est une notion capitale de la programmation objet. Le nom d’héritage est bien
choisi, car il désigne la transmission automatique de propriétés et de méthodes d’un objet
père vers un objet fils. Ce principe évite la duplication de code.
Par exemple, si nous devons définir des objets de types Chien et Cheval, nous aurons
besoin d’une classe parente Animal, qui portera toutes les propriétés communes,
comme l’âge, le sexe ou le nom. En JavaScript, tous les objets héritent du type de plus bas
niveau, Object, qui définit entre autres la méthode toString() qui transforme en chaîne
de caractères lisibles toutes les propriétés de l’objet.
De la même manière, les éléments HTML affichés sur la page sont des objets issus d’une
longue liste d’héritages permettant de regrouper les propriétés communes.
Après avoir défini les principales caractéristiques de la programmation objet, nous allons
apprendre à créer des objets et à les utiliser en JavaScript. Malheureusement, le
JavaScript utilise un modèle particulier de création d’objets, à base de prototypes. La
longue histoire du langage a également abouti à des syntaxes très variées. Rassurez-vous,
la souplesse de JavaScript facilite l’usage rapide des objets, même si tous les concepts ne
sont pas parfaitement maîtrisés à la première lecture.
Un objet JavaScript est construit grâce à une fonction constructeur. Cette fonction orga-
nise la structure de l’objet en définissant les propriétés et les méthodes. Le constructeur
initialise certaines propriétés avec des valeurs de départ.
Le JavaScript possède des constructeurs natifs (comme Date, Array, Object). Le
développeur peut bien sûr créer ses propres objets. Créons notre constructeur d’objet
de type Animal :
LE FORMAT JSON
Le format JSON permet de définir des structures de données à partir d’objets et de ta-
bleaux.
Un objet JSON est un ensemble de couples propriété:valeur placé entre acco-
lades. Les couples sont séparés par une virgule. La propriété et sa valeur sont séparées
par le caractère deux-points.
La structure générique d’un objet JSON est donc :
{ propriete1 : valeur1, …, proprieteN : valeurN }
Un tableau JSON est une suite de valeurs séparées par des virgules et placée entre cro-
chets. La structure générique d’un tableau JSON est donc :
[ valeur1, …, valeurN ]
Le format JSON est tellement pratique et logique qu’il remplace souvent les construc-
teurs de la déclaration native des objets et des tableaux.
Ainsi, un tableau sera souvent déclaré par du JSON, à la fois plus lisible et plus compact :
var jours=["Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim"];
La déclaration classique serait :
var jours =new Array("Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim");
Les deux créations ont exactement le même résultat. Le tableau jours contient :
Pour les objets, la déclaration avec JSON facilite aussi la lisibilité et la compacité. La créa-
Nous allons créer l’objet truiteFario par JSON, qui définit quelques caractéristiques
d’une truite fario :
var truiteFario = {
nom: "Fario",
noms: ["Truite sauvage","Truite commune"],
latin: "salmo truta fario",
image: "fario.jpg",
particularite: "Présence de points rouges et noirs auréolés",
tailleMoyenne: 30,
tailleMaxi: 70,
maille: 25,
};
Les propriétés de notre objet ne sont pas des chaînes avec les délimiteurs ", comme
le réclame la syntaxe JSON. Le JavaScript autorise cette notation directe, plus
compacte et plus lisible.
La virgule sépare chaque couple de propriété/valeur. Il y a une virgule ignorée
avant l’accolade de fermeture. La syntaxe JSON ne l’autoriserait pas.
La propriété noms est un tableau de chaînes de caractères.
La notation pointée est toujours utilisée pour accéder aux valeurs des propriétés de notre
objet. Par exemple, pour obtenir le nombre de noms alternatifs de notre truite fario, nous
écrivons :
truiteFario.noms.length
Comme pour les objets créés par leur constructeur natif, l’accès aux propriétés peut se
faire aussi par les crochets. Ainsi, le second nom alternatif est trouvé indifféremment par :
truiteFario["noms"][1]
ou par :truiteFario.noms[1]
Le format JSON est également très utilisé dans le cadre d’échange de données entre le
navigateur et le serveur, lors d’appels AJAX par exemple, que nous traiterons dans la
seconde partie dédiée à l’interactivité.
Notez que les propriétés sont bien des chaînes entourées des " et qu’il n’y a pas de vir-
gule après la dernière propriété. La méthode display() a été ignorée car elle n’est pas
Grâce à la double notation d’accès aux propriétés d’un objet, nous pouvons transformer
notre tableau associatif en objet classique :
La construction (clé, valeur) permet de créer des agrégats. Voici un exemple JSON, dans
lequel les agrégats sont codés avec des accolades ouvrante/fermante.
{"nom": "Philippe Rigaux", "tél": 2157786, "email": "philippe@cnam.fr"}
<nom>Philippe Rigaux</nom>
<tel>2157786</tel>
<email>philippe@cnam.fr</email>
</personne>
On constate tout de suite que le codage XML est beaucoup plus bavard que celui de
JSON.
Important
Les termes varient pour désigner ce que nous appelons agrégat; on pourra
parler d’objet (JSON), d’élément (XML), de dictionnaire (Python), de tableau
associatif (PHP), de hash map (Java), etc. D’une manière générale ne vous laissez pas
troubler par la terminologie variable, et ne lui accordez pas plus d’importance qu’elle n’en
mérite. Un agrégat est un ensemble de paires (clé, valeur), chaque clé étant unique.
Nous avons parlé de la nécessité de composer des structures comme condition essentielle
pour obtenir une puissance de représentation suffisante. Sur la base des paires (clé,
valeur) et des agrégats vus ci-dessus, une extension immédiate par composition consiste à
considérer qu’un agrégat est une valeur. On peut alors créer une paire clé-valeur dans
laquelle la valeur est un agrégat, et imbriquer les agrégats les uns dans les autres, comme
le montre l’exemple ci-dessous.
{
"nom": {
"prénom": "Philippe",
"famille": "Rigaux"
},
"tél": 2157786,
"email": "philippe@cnam.fr"
}
Continuons à explorer les structures de base. Une liste est une valeur constituée d’une
séquence de valeurs. Les listes sont représentés en JSON (où on les appelle tableaux) avec
des crochets ouvrant/fermant.
[2157786, 2498762]
Une liste est une valeur, et on peut donc l’associer à une clé dans un agrégat.
Note
Un des inconvénients de XML est qu’il existe plusieurs manières de représenter les
mêmes données, ce qui donne lieu à des réflexions et débats inutiles. Un langage comme
JSON propose un ensemble minimal et suffisant de structures, représentées avec
concision. La puissance de XML ne vient pas de sa syntaxe mais de la richesse des
normes et outils associés.
Et voilà pour l’essentiel. On peut faire des agrégats d’agrégats d’agrégats, sans limitation
de profondeur. On peut combiner des agrégats, des listes et des paires (clé, valeur) pour
créer des structures riches et flexibles. Enfin, le codage (JSON ou XML) donne à ce que
nous appellerons maintenant “documents” l’autonomie et la robustesse (pour des
transferts sur le réseau) attendu.
Fig. 3.1 Représentation arborescente (JSON: arêtes étiquetées par les clés)
Le codage associe bien une structure (l’arbre) et le contenu (le texte dans les feuilles). Une
autre possibilité est de représenter à la fois la structure et les valeurs comme des nœuds.
C’est ce que fait XML (figure Représentation arborescente (XML: clés représentées par
des nœuds)).
Résumons maintenant la syntaxe de JSON qui remplace, il faut bien le dire, tout à fait
avantageusement XML dans la plupart des cas à l’exception sans doute de documents
“rédigés” contenant beaucoup de texte: rapports, livres, documentation, etc. JSON est
concis, simple dans sa définition, et très facile à associer à un langage de programmation
(les structures d’un document JSON se transposent directement en structures du langage
de programmation, valeurs, listes et objets).
Note
JSON est l’acronyme de JavaScript Object Notation. Comme cette expression le suggère,
il a été initialement créé pour la sérialisation et l’échange d’objets Javascript entre deux
applications. Le scénario le plus courant est sans doute celui des applications Ajax dans
lesquelles le serveur (Web) et le client (navigateur) échangent des informations codées en
JSON. Cela dit, JSON est un format texte indépendant du langage de programmation
utilisé pour le manipuler, et se trouve maintenant utilisé dans des contextes très éloignés
des applications Web.
C’est le format de données principal que nous aurons à manipuler, et comme format
d’échange sur le Web par d’innombrables applications.
La syntaxe est très simple et a déjà été en grande partie introduite précédemment. Elle est
présentée ci-dessous, mais vous pouvez aussi vous référer à des sites
comme http://www.json.org/.
Valeurs simples
Valeurs complexes
Les valeurs complexes sont soit des objets (agrégats de paires clé-valeur) soit des listes
(séquences de valeurs). Un objet est un ensemble de paires clé-valeur dans lequel chaque
clé n’apparaît qu’une fois. C’est ce que nous avons appelé agrégat dans un contexte plus
général.
Un objet est une valeur complexe et peut être utilisé comme valeur dans une paire clé-
valeur.
"director": {
"last_name": "Fincher",
"first_name": "David",
"birth_date": 1962,
"oscar": true
}
Une liste (array) est une séquence de valeurs dont les types peuvent varier: Javascript est
un langage non typé et les tableaux peuvent contenir des éléments hétérogènes, même si
ce n’est sans doute pas recommandé. Une liste est une valeur complexe, utilisable dans
une paire clé-valeur.
La liste suivante est valide, bien que contenant des valeurs hétérogènes.
"bricabrac": ["Eisenberg", 1948, {"prenom", "Philippe", "nom": "Rigaux"},
true, [1, 2, 3]]
L’imbrication est sans limite: on peut avoir des tableaux de tableaux, des tableaux d’objets
contenant eux-mêmes des tableaux, etc. Pour représenter un document avec JSON, nous
adopterons simplement la contrainte que le constructeur de plus haut niveau soit un objet
(en bref, document et objet sont synonymes).
{
"title": "The Social network",
"summary": "On a fall night in 2003, Harvard undergrad and \n
programming genius Mark Zuckerberg sits down at his \n
computer and heatedly begins working on a new idea. (...)",
"year": 2010,
"director": {"last_name": "Fincher","first_name": "David"},
Perrin Léo 18
Petit Loïc 32
Leroux Pierre 27
Il existe trois formats pour représenter un tableau de données : les formats CSV, XML et
JSON.
Ces trois formats sont des fichiers composés d’une suite de caractères où l’on distingue
deux types d’information :
Les données.
Les caractères permettant de structurer ces données.
a) Le format CSV
Le format Comma Separated Values (CSV) structure les données sous la forme
de valeurs séparées par des virgules. Ce format est très facile à générer et à
manipuler. Chaque ligne du fichier CSV correspond à une ligne du tableau et
chaque valeur séparée par une virgule correspond à une colonne du tableau.
La première ligne du fichier contient l'entête de la table, à savoir le nom de chacune des
colonnes. Les lignes suivantes contiennent les données du tableau, en respectant l'ordre
des colonnes. Le séparateur n'est pas forcément une virgule, on peut par exemple utiliser
le point-virgule.
c) Le format JSON
Le format JavaScript Object Notation (JSON) est un format plus récent utilisé pour
représenter des objets qui dérive de la notation des objets du langage JavaScript. Un
document JSON est essentiellement un ensemble de paires constituées d'une étiquette et
d'une valeur ou d'une liste de valeurs. Les paires sont placées entres accolades et séparées
par des virgules. Les valeurs des listes sont placées entre crochets et séparées par des
virgules.
Le premier ensemble possède une paire dont la clé est liste et dont la valeur est une liste
de trois éléments. Chacun de ces trois éléments est un ensemble avec trois paires
représentant respectivement le nom, le prénom et l’âge de chaque personne.
Remarquez que les nombres ne sont pas placés entre guillemets, contrairement aux mots
et aux clés qui doivent être entre guillemets.