JSON

JSON signifie Javascript Serial Object Notation

Traduction: Notation Sérialisée d'Objet Javascript.

C'est la notation d'un objet Javascript sous forme de string,
pour le faire transiter par le réseau, ou le stocker sur le disque côté serveur
(pour stocker des données sans base de données ni langage SQL).

Côté client, le string JSON reçu du serveur est transformé en objet JS avec
JSON.parse(string)

Pour permettre son envoi au serveur, l'objet JSON est transformé en string avec
JSON.stringify(obj)

Syntaxe JSON

Un objet JSON ressemble beaucoup à un objet ou un tableau Javascript.

Pour être valide, un string JSON
* Doit être entouré d'accolades, ou crochets si c'est un tableau
* Les noms de propriétés et les valeurs type string doivent être entourés de guillemets
* Les valeurs peuvent être: un string, un booleen, un entier, un nombre à virgule flottante
* Les valeurs doivent être sur une seule ligne: Pas de retour à la ligne ni de tab ni ' ni ", mettre \n \t \\' \"
* Il ne faut surtout pas mettre la dernière virgule (alors que JS le tolère)

Vérifier la syntaxe d'un string JSON à l'aide d'un validateur.
Validateurs JSON
jsonformatter.curiousconcept.com
jsonformatter.org

Outil pratique pour coloriser du JSON dans une page web Colorisateur syntaxique JSON → HTML

JS accède aux valeurs JSON

Javascript peut accéder aux valeurs à l'aide de la notation point / crochets.

On peut boucler sur les propriétés/valeurs d'un objet avec for of.

Exemple l'API REST d'Atmosud

BFMTV Marseille chaque jour se connecte à l'API REST d'ATMOSUD pour obtenir la qualité de l'air.
En passant à l'URL en paramètre la date et le code INSEE,
https://api.atmosud.org/iqa2021/commune/indices/journalier?dates_echeances=2025-07-01,2025-07-01&insee=13206

Le serveur ATMOSUD (pour qui j'ai été développeur, Linux/nginx/Python/PostgreSQL que du bonheur!)
répond du JSON:
{
  "13206":
  {
    "code_insee": "13206",
    "commune": "",
    "valeurs": {
      "2025-07-02": {
        "date_diffusion": "2025-07-01",
        "date_echeance": "2025-07-01",
        "echeance": 0,
        "majoritaire": ["o3"],
        "indice": {
          "couleur": "#FF5050",
          "qualificatif": "Mauvais"
        }
      }
    }
  }
}
Le 1er juillet 2025 l'air est mauvais dans le 6e arr avec comme polluant majoritaire l'Ozone O3. Javascript * Obtient la date du jour * Envoie la requête en AJAX GET * Transforme le string JSON reçu en objet Javascript avec JSON.parse(string) pour mettre à jour l'interface.
const date = new Date();
let mois = date.getMonth() + 1; if(mois<10) mois = '0'+mois;
let jour = date.getUTCDate();   if(jour<10) jour = '0'+jour;
const strdate = date.getFullYear()+'-'+mois+'-'+jour

const url = 'https://api.atmosud.org/iqa2021/commune/indices/journalier?dates_echeances='+
  strdate+','+strdate+'&insee=13206';
console.log(url);

const xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onload = function(){
  const json = JSON.parse(xhr.responseText);
  const obj = json[13206].valeurs[strdate];
  console.log(obj.majoritaire+' '+obj.indice.couleur+' '+obj.indice.qualificatif);
};
xhr.send();

Exemple location d'appartement

Un site de location immobilière me donne les appartements à louer à Perpignan à moins de 500€/mois.
le serveur répond par un tableau:
[
  {
    "type": "Studio",
    "loyer_mensuel_euros": 492.25,
    "charges_incluses": true,
    "nombre_de_pièces": 1,
    "surface_m²": 25,
    "étage": 4,
    "chauffage": "individuel",
    "informations":["ascenseur","parking"]
  },
  {
    "type": "F2",
    "loyer_mensuel_euros": 499,
    "charges_incluses": true,
    "nombre_de_pièces": 2,
    "surface_m²": 32,
    "étage": 1,
    "chauffage": "individuel",
    "informations":["parking", "meublé", "balcon"]
  }
]
const s = `[
  {
    "type": "Studio",
    "loyer_mensuel_euros": 492.25,
    "charges_incluses": true,
    "nombre_de_pièces": 1,
    "surface_m²": 25,
    "étage": 4,
    "chauffage": "individuel",
    "informations":["ascenseur","parking"]
  },
  {
    "type": "F2",
    "loyer_mensuel_euros": 499,
    "charges_incluses": true,
    "nombre_de_pièces": 2,
    "surface_m²": 32,
    "étage": 1,
    "chauffage": "individuel",
    "informations":["parking", "meublé", "balcon"]
  }
]`;
const json = JSON.parse(s);
console.log(json[0].type, json[0].loyer_mensuel_euros+'', json[0].informations[0]);
Ce qui donne dans la console:
Studio 492.25€ ascenseur

Lister les propriétés/valeurs

Si on ne connait pas les propriétés de l'objet on peut les énumérer avec for of:
console.log('1er appart:');
for (const [key, value] of Object.entries(json[0])) {
  console.log(`${key} → ${value}`);
}
Ce qui donne
 1er appart:
 type → Studio
 loyer_mensuel_euros → 492.25
 charges_incluses → true
 nombre_de_pièces → 1
 surface_m² → 25
 étage → 4
 chauffage → individuel
 informations → ascenseur,parking

Obtenir un fichier JSON avec AJAX

const xhr = new XMLHttpRequest()
xhr.open("GET", "data/produits.json")
xhr.onload = function() {
	articles = JSON.parse(this.responseText)
	console.log (articles[0].nom)
};
xhr.send()


Envoi d'un objet JSON au serveur

json = `{"prenom":"Jimi", "nom":"Hendrix"}`
const obj = JSON.parse(json)
obj.prenom='James Marshall'

const xhr = new XMLHttpRequest()
xhr.open("POST", "script.php")
xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded")
xhr.onload = function(){
	console.log(this.responseText)
};
xhr.send('var=val&monProfil='+encodeURIComponent(JSON.stringify(obj)))

// Si le serveur en répond rien, 1 seule ligne suffit:
//navigator.sendBeacon("script.php", `var=val&monProfil=${json}`);
<?php
if(isset($_POST['monProfil'])){
	$obj = json_decode($_POST['monProfil']);
	echo $obj->prenom;
}
?>


indenter/compacter du JSON

Outil JS pour indenter/compacter du JSON