"titre" chasse fixe, gras : texte à écrire tel quelfichier italique : valeur à remplacerapplication/json · extension .json.package.json, settings.json de VS Code…jsonb de PostgreSQL, journaux, carnets Jupyter.| objet | {"nom": "Eve"} | clés → valeurs, sans ordre |
| tableau | [1, "a", null] | liste ordonnée |
| chaîne | "texte" | guillemets doubles, Unicode |
| nombre | 42 · -3.5 · 6.02e23 | un seul type numérique |
| booléen | true · false | minuscules, sans guillemets |
| nul | null | absence de valeur |
Objets et tableaux contiennent d’autres valeurs et s’imbriquent librement. Ni date, ni binaire (page 2).
{"titre":"Candide","tags":["conte"]}{
"titre": "Candide",
"tags": [
"conte"
]
}Même donnée : les espaces entre les éléments n’ont aucun sens. Compact pour transmettre, indenté pour lire.
| 2000–2002 | format décrit et diffusé par Douglas Crockford (site json.org) |
| 2006 | RFC 4627 : première spécification de l’IETF |
| 2014 | RFC 7159 : toute valeur admise à la racine |
| 2017 | RFC 8259 (norme Internet STD 90) et ECMA-404, 2e édition : UTF-8 obligatoire entre systèmes |
{ 1
"titre": "Candide", 2
"annee": 1759, 3
"disponible": true, 4
"prix": null,
"auteur": { 5
"nom": "Voltaire",
"naissance": 1694 6
},
"tags": ["conte", "philosophie"] 7
} { }.:, puis une valeur — ici une chaîne.true, false, null : minuscules, sans guillemets.[ ]."nom", jamais 'nom'.{"a": 1}, jamais {a: 1}.true, false, null en minuscules, sans guillemets.undefined, ni NaN, ni Infinity, ni fonction.+ initial ni zéro de tête.", \ et les caractères de contrôle.// ni /* */.L’ordre des clés d’un objet ne porte aucun sens ; l’ordre des éléments d’un tableau, si.
jq . f, py -m json.tool f, ou Maj+Alt+F dans VS Code.{ } et [ ], littéraux.Messages d’erreur types : page 6.
| ✗ faux | ✓ correct |
|---|---|
{'a': 1} | {"a": 1} |
{a: 1} | {"a": 1} |
[1, 2, 3,] | [1, 2, 3] |
{"a": 1 "b": 2} | {"a": 1, "b": 2} |
{"ok": True} | {"ok": true} |
{"x": None} | {"x": null} |
{"x": undefined} | {"x": null} |
{"n": NaN} | {"n": null} |
{"n": 007} | {"n": 7} |
{"n": .5} | {"n": 0.5} |
{"n": 1,5} | {"n": 1.5} |
"C:\dossier" | "C:\\dossier" |
{"a":1}{"b":2} | [{"a":1},{"b":2}] |
{"a": 1} // note | {"a": 1} |
membre | une paire "clé": valeur dans un objet |
clé · nom | la chaîne qui désigne une valeur |
élément | une valeur dans un tableau |
racine | la valeur qui englobe tout le document |
| sérialiser | données en mémoire → texte JSON (encoder) |
| désérialiser | texte JSON → données (analyser, parser) |
| analyseur | programme qui lit et vérifie le JSON (parser) |
| indenter | mettre en forme avec retraits ; l’inverse : minifier |
| bien formé | conforme à la grammaire JSON |
| valide | conforme, en plus, à un schéma (page 4) |
| {} | objet vide |
| {"a": 1, "b": 2} | deux membres séparés par une virgule |
| {"prénom": "Anne"} | clé libre : accents, espaces, symboles permis |
| {"": 0} | même la clé vide est permise |
| {"a": 1, "a": 2} | ! clé en double : « devrait » être unique (RFC 8259) |
Clés en double : la plupart des analyseurs gardent la dernière valeur (Python, JavaScript) ; d’autres signalent une erreur ou conservent toutes les paires. Résultat imprévisible : les proscrire.
Ordre des membres sans signification : {"a":1,"b":2} = {"b":2,"a":1}. Ne jamais s’y fier.
| [] | tableau vide |
| [1, 2, 3] | éléments ordonnés : [3, 2, 1] est un autre tableau |
| ["a", 1, true, null] | types mêlés : permis, mais à éviter |
[[1, 2], [3, 4]] | tableaux imbriqués (matrice) |
| [{"id": 1}, {"id": 2}] | tableau d’objets : la forme d’une table de données |
| \" | guillemet double |
| \\ | barre oblique inverse |
| \/ | barre oblique (facultatif : / suffit) |
| \n · \r | saut de ligne · retour chariot |
| \t | tabulation |
| \b · \f | retour arrière · saut de page |
| \u00e9 | caractère Unicode en 4 chiffres hexadécimaux : é |
| \ud83d\ude00 | au-delà de U+FFFF : paire de substitution (ici un émoji) |
À échapper obligatoirement : le guillemet ", la barre oblique inverse \ et les caractères de contrôle U+0000 à U+001F (saut de ligne, tabulation…).
! Invalides : \' \x41 \0 \a. Pas de retour à la ligne brut dans une chaîne : écrire \n.
En UTF-8, "été" et "\u00e9t\u00e9" sont la même chaîne.
Chemins Windows : "C:\\Users\\docs" — ou "C:/Users/docs", accepté par la plupart des programmes.
42 ou "ok" forment un document JSON (RFC 8259) ; d’anciens analyseurs n’acceptent qu’un objet ou un tableau.valeur = objet / tableau / chaîne / nombre
/ "true" / "false" / "null"
objet = "{" [ membre *( "," membre ) ] "}"
membre = chaîne ":" valeur
tableau = "[" [ valeur *( "," valeur ) ] "]"
chaîne = guillemet *caractère guillemet
nombre = [ "-" ] entier [ fraction ] [ exposant ]
entier = "0" / ( chiffre-1-à-9 *chiffre )
fraction = "." 1*chiffre
exposant = ( "e" / "E" ) [ "-" / "+" ] 1*chiffreNotation ABNF simplifiée d’après RFC 8259 : / ou · [ ] facultatif · * zéro, une ou plusieurs fois · 1* au moins une fois. Des espaces peuvent entourer chaque signe { } [ ] : ,.
-signe12partie.75fractione+3exposant0-0423.14-0.51e101E-32.5e+8+101.55.1.e30x1F1_0001,5NaNInfinityUn seul type numérique : 1, 1.0 et 1e0 expriment la même quantité ; certains langages les distinguent (Python : int et float).
9007199254740991 (RFC 8259, § 6).9007199254740993 devient 9007199254740992.0.1 + 0.2 donne 0.30000000000000004."19.90".| Besoin | Convention usuelle |
|---|---|
| date, heure | chaîne ISO 8601 : "2026-09-29T14:30:00Z" |
| durée | chaîne ISO 8601 "PT1H30M", ou nombre + unité dans le nom : "dureeSec": 5400 |
| binaire (image…) | chaîne Base64, ou lien vers le fichier |
| commentaire | clé dédiée "_note" ; ou format JSONC / JSON5 (page 3) |
undefined | omettre la clé, ou null |
| grand entier, décimal exact | chaîne : "12345678901234567890" |
| référence, cycle | identifiant : "auteurId": "a-42" |
| type d’objet | champ discriminant : "type": "livre" |
| JavaScript accepte | JSON exige |
|---|---|
{nom: 'Candide'} | {"nom": "Candide"} |
[1, 2,] | [1, 2] |
// commentaire | — (aucun commentaire) |
undefined · NaN · Infinity | null, ou une chaîne |
new Date() | "2026-09-29T14:30:00Z" |
! Ne jamais lire du JSON avec eval() : exécution de code arbitraire. Utiliser JSON.parse().
", \ et les caractères de contrôle.e + accent combinant U+0301). Normaliser (NFC) avant de comparer clés et valeurs.1.0 et 1, "\u00e9" et "é".jq -S . a.json > a2.json, idem pour b, puis diff a2.json b2.json.{
"id": "cmd-2026-00042",
"statut": "expediee",
"creeLe": "2026-09-29T14:30:00Z",
"client": { "id": "c-1187", "nom": "Exemple SARL" },
"lignes": [
{ "sku": "LIV-001", "quantite": 2, "prix": "12.50" },
{ "sku": "LIV-007", "quantite": 1, "prix": "8.00" }
],
"total": { "montant": "33.00", "devise": "EUR" },
"remarque": null
}Identifiants en chaînes · statut lisible · date ISO avec fuseau · montants exacts avec devise · clé remarque présente mais vide.
camelCase (dateCreation) ou snake_case (date_creation) ; clés sans accent ni espace.quantite est toujours un nombre, jamais tantôt 2, tantôt "2".[] plutôt que null.estActif, enStock.poidsKg, dureeSec, tailleOctets."statut": "expediee" plutôt que "statut": 3.Z (UTC) ou +02:00.EUR, USD).null (vide) ne disent pas la même chose : fixer la convention et la documenter.| une chose et ses propriétés | objet : {"titre": …, "annee": …} |
| une liste ordonnée | tableau : […] |
| des enregistrements | tableau d’objets : [{…}, {…}] |
| un accès par clé | objet indexé : {"fr": "Bonjour", "en": "Hello"} |
| un couple de taille fixe | tableau court, ordre documenté : [2.35, 48.85] |
! GeoJSON (RFC 7946) écrit les positions [longitude, latitude] : l’inverse de l’usage courant.
| JSON Lines | un document par ligne (.jsonl, dit aussi NDJSON) : journaux, gros volumes, flux |
| JSONC | JSON + commentaires : settings.json de VS Code |
| JSON5 | + commentaires, virgules finales, guillemets simples, clés nues |
| GeoJSON | lieux et géométries (RFC 7946) |
| JSON-LD | données liées (W3C) ; balisage schema.org des pages web |
| I-JSON | profil strict pour l’interopérabilité (RFC 7493) |
| BSON · CBOR · MessagePack | équivalents binaires, plus compacts |
{"donnees": […], "suivant": …} — pour ajouter plus tard pagination et métadonnées sans rien casser.| Content-Type: application/json | le corps envoyé est du JSON |
| Accept: application/json | le client demande du JSON en réponse |
| 200 · 201 | succès · ressource créée (en-tête Location) |
| 204 | succès sans corps : rien à analyser |
| 400 | requête mal formée — par exemple JSON invalide |
| 401 · 403 | non authentifié · non autorisé |
| 404 · 409 | ressource introuvable · conflit avec l’état actuel |
| 415 | type de média refusé : vérifier Content-Type |
| 422 | JSON bien formé, mais données refusées |
| 429 · 500 | trop de requêtes : ralentir · erreur du serveur |
charset=utf-8 est superflu : JSON est en UTF-8 et RFC 8259 ne définit aucun paramètre charset.
{
"type": "https://example.com/erreurs/stock",
"title": "Stock insuffisant",
"status": 409,
"detail": "Il reste 1 exemplaire de LIV-007.",
"instance": "/commandes/cmd-2026-00042"
}| type | URI de la catégorie d’erreur (par défaut : about:blank) |
| title | résumé lisible, identique pour toute la catégorie |
| status | code HTTP |
| detail · instance | explication · URI propres à cette occurrence |
Type de média : application/problem+json. Des membres supplémentaires sont permis.
| "" | le document entier |
| /lignes/0/sku | clé lignes, élément 0, clé sku → "LIV-001" |
| ~0 · ~1 | ~ et / à l’intérieur d’un nom de clé |
application/json-patch+json[
{ "op": "test", "path": "/statut", "value": "expediee" },
{ "op": "replace", "path": "/statut", "value": "livree" },
{ "op": "add", "path": "/lignes/-",
"value": { "sku": "LIV-009", "quantite": 1 } },
{ "op": "remove", "path": "/remarque" }
]Opérations : add remove replace move copy test, appliquées dans l’ordre ; si l’une échoue, le patch entier échoue. /lignes/- : après le dernier élément.
application/merge-patch+jsonOn envoie un objet partiel : ses membres remplacent ceux de la cible, null supprime la clé, un tableau est remplacé en entier. Ex. {"statut": "livree", "remarque": null}.
| Format | Forces | Limites |
|---|---|---|
| JSON | simple, universel, natif du web | ni commentaires ni dates |
| XML | attributs, espaces de noms, documents | verbeux, lourd à traiter |
| YAML | très lisible, commentaires ; lit le JSON (YAML 1.2) | indentation significative, typage piégeux |
| TOML | configuration claire, dates natives | peu fait pour l’imbrication profonde |
| CSV | tableaux plats, tableurs | ni types ni imbrication |
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://example.com/schemas/commande.json",
"title": "Commande",
"type": "object",
"required": ["id", "statut", "lignes"],
"properties": {
"id": { "type": "string", "pattern": "^cmd-\\d{4}-\\d{5}$" },
"statut": {
"enum": ["en-attente", "expediee", "livree", "annulee"]
},
"creeLe": { "type": "string", "format": "date-time" },
"lignes": {
"type": "array",
"minItems": 1,
"items": { "$ref": "#/$defs/ligne" }
},
"remarque": { "type": ["string", "null"], "maxLength": 500 }
},
"$defs": {
"ligne": {
"type": "object",
"required": ["sku", "quantite"],
"properties": {
"sku": { "type": "string", "minLength": 1 },
"quantite": { "type": "integer", "minimum": 1 },
"prix": { "$ref": "#/$defs/decimal" }
},
"additionalProperties": false
},
"decimal": { "type": "string", "pattern": "^\\d+\\.\\d{2}$" }
}
}Dans une chaîne JSON, la barre oblique inverse d’une expression régulière se double : \\d pour \d.
| Donnée | Résultat |
|---|---|
| la commande de la page 3 | ✓ valide |
"quantite": 0 | ✗ minimum : 0 < 1 |
"quantite": 2.5 | ✗ type : pas un entier |
"statut": "Livree" | ✗ enum : la casse compte |
"lignes": [] | ✗ minItems |
ligne avec "couleur": "rouge" | ✗ additionalProperties |
sans "id" | ✗ required |
"prix": "12.5" | ✗ pattern : deux décimales |
"creeLe": "29/09/2026" | ✓ en général ! format n’est qu’une annotation |
clé inconnue "urgent": true à la racine | ✓ racine sans additionalProperties: false |
| ajv | validateur JavaScript (Node.js), le plus répandu |
| jsonschema | Python : validate(instance=doc, schema=s) |
| check-jsonschema | ligne de commande, intégration continue |
| VS Code | valide pendant la saisie si le fichier déclare "$schema", ou via le réglage json.schemas |
| SchemaStore.org | catalogue de schémas des fichiers de configuration courants |
| type | "string" "number" "integer" "boolean" "object" "array" "null" — ou une liste : ["string", "null"] |
| enum · const | valeurs permises · valeur imposée |
| title · description · default | documentation ; ! default ne remplit aucune valeur |
| minLength · maxLength | longueur en caractères |
| pattern | expression régulière (ECMA-262), non ancrée |
| format | date-time date time duration email uri uuid ipv4 ipv6 hostname… |
| minimum · maximum | bornes incluses |
| exclusiveMinimum | borne exclue (un nombre) ; idem exclusiveMaximum |
| multipleOf | multiple de : 0.01, 5… |
| properties | schéma de chaque clé déclarée |
| required | liste des clés obligatoires |
| additionalProperties | clés non déclarées ; false : interdites |
| patternProperties | schéma des clés qui suivent un motif |
| minProperties · maxProperties | nombre de clés ; propertyNames : contraintes sur leurs noms |
| dependentRequired | si la clé A est présente, B devient obligatoire |
| unevaluatedProperties | comme additionalProperties, mais voit à travers allOf, $ref… |
| items | schéma de chaque élément |
| prefixItems | schémas des premiers éléments, rang par rang (n-uplet) |
| minItems · maxItems | nombre d’éléments |
| uniqueItems | true : aucun doublon |
| contains | au moins un élément conforme (minContains, maxContains) |
| allOf | conforme à tous les sous-schémas |
| anyOf | conforme à au moins un |
| oneOf | conforme à exactement un |
| not | non conforme |
| if · then · else | validation conditionnelle |
| $defs · $ref | définitions réutilisables : "$ref": "#/$defs/ligne" (JSON Pointer) |
| $schema · $id | version du langage · identifiant du schéma |
additionalProperties: false, une clé mal orthographiée ("quantitee") passe inaperçue.required se place dans l’objet parent, pas dans la propriété.pattern non ancré : "[0-9]+" accepte "abc1" → écrire "^[0-9]+$".format n’est qu’une annotation par défaut : activer son contrôle dans le validateur.integer accepte 1.0 : un nombre sans partie décimale est un entier.oneOf échoue si deux branches conviennent : anyOf suffit souvent.definitions → $defs ; items en liste → prefixItems ; exclusiveMinimum booléen → nombre.jqcommande-roptions'.livres[0].titre'filtrelivres.jsonfichierSans fichier, jq lit l’entrée standard. | enchaîne les filtres, comme dans le shell.
{ "livres": [
{ "titre": "Candide", "auteur": "Voltaire",
"annee": 1759, "tags": ["conte", "philosophie"] },
{ "titre": "Notre-Dame de Paris", "auteur": "Hugo",
"annee": 1831, "tags": ["roman"] },
{ "titre": "Les Misérables", "auteur": "Hugo",
"annee": 1862, "tags": ["roman"] }
] }| . | tout le document, indenté et coloré |
| .livres[0].titre | "Candide" |
| .livres[-1].annee | 1862 (dernier élément) |
| .livres[].titre | les trois titres, un par ligne |
| .livres | length | 3 |
| .livres[0] | keys | ["annee", "auteur", …] (triées) |
| .livres[0].prix // "inconnu" | clé absente → null, sans erreur ; // : valeur de repli |
| .livres[] | select(.auteur == "Hugo") | .titre | les deux titres de Hugo |
| .livres[] | select(any(.tags[]; . == "roman")) | les romans |
| .livres | map(.titre) | ["Candide", …] : un tableau |
| [.livres[].annee] | add / length | 1817.33… : la moyenne |
| .livres | group_by(.auteur) | map({auteur: .[0].auteur, n: length}) | [{"auteur": "Hugo", "n": 2}, …] |
| .. | .titre? // empty | toutes les clés titre, à toute profondeur |
| .livres[] | "\(.titre) (\(.annee))" | avec -r : Candide (1759)… |
| if .annee < 1800 then "ancien" else "moderne" end | condition |
| select(.titre | test("^les"; "i")) | expression régulière (i : sans casse) |
| ascii_downcase · split(" ") · join(", ") | traiter les chaînes |
| unique · flatten · min_by(f) · add | traiter les tableaux |
| jq . brut.json > joli.json | indenter (-c : compacter) |
| jq empty f.json && echo "valide" | valider (code de retour) |
| jq -c '.[]' t.json > f.jsonl | tableau → JSON Lines |
| jq -s . f.jsonl | JSON Lines → tableau |
| jq -r '.[] | [.a, .b] | @csv' f.json | exporter en CSV |
| jq -s '.[0] * .[1]' a.json b.json | fusion profonde de deux objets |
! Sous Windows PowerShell 5.1, les guillemets doubles d’un filtre sont mal transmis : mettre le filtre dans un fichier (jq -f) ou utiliser Git Bash.
jq --stream, ijson (Python).gzip (très efficace sur JSON) ou format binaire (CBOR, MessagePack).| -r | chaînes brutes, sans guillemets (pour les scripts) |
| -c | sortie compacte : un document par ligne |
| -s | réunir toutes les entrées dans un tableau (slurp) |
| -n | ne rien lire : construire du JSON de toutes pièces |
| -S | trier les clés |
| -e | code de retour selon le résultat (false, null → 1) |
| -R | lire du texte brut : chaque ligne devient une chaîne |
| -f fichier | lire le filtre dans un fichier |
| --arg n v | variable $n : une chaîne |
| --argjson n v | variable $n : une valeur JSON |
| --indent n · --tab | retrait de n espaces · tabulations |
| .livres[0].prix = 12 | ajouter ou remplacer une valeur |
| .livres[].annee |= tostring | modifier sur place |
| del(.livres[].tags) | supprimer une clé partout |
| .livres |= sort_by(.titre) | trier le tableau en place |
| .livres[] | {titre, annee} | ne garder que certaines clés |
| with_entries(.key |= ascii_upcase) | renommer les clés |
| to_entries · from_entries | objet ↔ [{"key": …, "value": …}] |
| .livres[] | [.titre, .annee] | @csv | ligne CSV (avec -r) |
| @tsv · @base64 · @uri · @html | autres encodages de sortie |
| py -m json.tool f | valider et indenter (Python) ; python3 sous Linux ; -m json depuis Python 3.14 |
| curl --json '{"a": 1}' url | POST en JSON, en-têtes Content-Type et Accept posés (curl ≥ 7.82) ; --json @f.json : depuis un fichier |
| curl -s url | jq '.data[].id' | interroger une API et filtrer |
| Maj+Alt+F | VS Code : formater ; validation par schéma, repli des blocs |
| Firefox | visionneuse JSON intégrée : replier, filtrer, JSON brut |
| gron | aplatit en lignes json.livres[0].titre = "Candide"; → grep |
Options de json.tool : --sort-keys, --compact, --no-ensure-ascii, --json-lines.
| $d = Get-Content f.json -Raw | ConvertFrom-Json | fichier → objets |
| $d.livres[0].titre | naviguer avec des points |
| $d | ConvertTo-Json -Depth 10 | objets → JSON |
| Invoke-RestMethod url | appel d’API : la réponse JSON devient un objet |
| ConvertFrom-Json -AsHashtable · Test-Json | PowerShell 7 (absents de la 5.1) |
! ConvertTo-Json s’arrête à la profondeur 2 par défaut : plus bas, les objets deviennent du texte ("System.Collections.Hashtable") → toujours préciser -Depth.
! @(1) | ConvertTo-Json donne 1 : le pipeline déroule le tableau. ConvertTo-Json -InputObject @(1) donne [1].
! Windows PowerShell 5.1 : curl y désigne Invoke-WebRequest → taper curl.exe.
const obj = JSON.parse(texte); // texte → valeur const txt = JSON.stringify(obj); // valeur → texte JSON.stringify(obj, null, 2); // indenté JSON.stringify(obj, ["id", "nom"]); // ces clés seules const d = JSON.parse(texte, (cle, val) => // « reviver » cle === "creeLe" ? new Date(val) : val); const rep = await fetch(url); // API web const data = await rep.json();
| undefined · fonction · Symbol | clé omise ; dans un tableau : null |
| NaN · Infinity | null |
| Date | chaîne ISO : "2026-09-29T14:30:00.000Z" |
| Map · Set | {} : contenu perdu |
| -0 | 0 |
| BigInt · objet cyclique | erreur TypeError |
| toJSON() | si l’objet la définit, sa valeur de retour est sérialisée |
Ce que devient chaque valeur avec JSON.stringify (ci-dessus). Au retour, JSON.parse rend les dates en chaînes (les convertir avec un reviver) et arrondit les entiers au-delà de 253.
import json
with open("f.json", encoding="utf-8") as f:
data = json.load(f) # fichier → objets
texte = json.dumps(data, ensure_ascii=False, indent=2)
data = json.loads(texte) # chaîne → objets
with open("sortie.json", "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)| JSON | Python |
|---|---|
| objet | dict |
| tableau | list (un tuple devient aussi un tableau) |
| chaîne | str |
| nombre entier · à virgule | int · float |
true · false · null | True · False · None |
ensure_ascii=True par défaut : é s’écrit \u00e9 → ensure_ascii=False.NaN et Infinity acceptés et produits par défaut, hors norme → allow_nan=False.{1: "a"} → {"1": "a"} ; l’aller-retour ne rend pas l’original.datetime, Decimal, set → TypeError : default=str, ou conversion explicite.parse_float=Decimal : décimaux exacts. sort_keys=True : sortie stable, comparable.encoding="utf-8" ; fichier avec BOM : "utf-8-sig".| "2026-09-29" | date seule (ISO 8601) |
| "2026-09-29T14:30:00Z" | instant en UTC : la forme la plus sûre |
| "2026-09-29T16:30:00+02:00" | même instant, avec décalage |
| 1790692200 | même instant en secondes Unix (JavaScript compte en millisecondes) |
! Sans fuseau, "2026-09-29T14:30:00" est ambiguë : JavaScript la lit en heure locale.
| Langage | Lire · écrire |
|---|---|
| PHP | json_decode($s, true) · json_encode($v) |
| Java (Jackson) | mapper.readValue(s, T.class) · mapper.writeValueAsString(v) |
| C# (.NET) | JsonSerializer.Deserialize<T>(s) · JsonSerializer.Serialize(v) |
| Go | json.Unmarshal(b, &v) · json.Marshal(v) |
| Rust (serde_json) | serde_json::from_str(s) · serde_json::to_string(&v) |
| PowerShell | ConvertFrom-Json · ConvertTo-Json -Depth 10 |
| PostgreSQL | doc->>'titre' (texte) · jsonb_build_object(…) |
| SQLite | json_extract(doc, '$.titre') · json_object(…) |
PHP : options JSON_PRETTY_PRINT, JSON_UNESCAPED_UNICODE, JSON_THROW_ON_ERROR (à combiner par |). Go : seuls les champs exportés (majuscule) sont sérialisés ; nom JSON fixé par la balise json:"titre".
| Python 3.14 · Node.js 24 | Cause probable |
|---|---|
Expecting property name enclosed in double quotesExpected property name or '}' | clé sans guillemets, ou entre guillemets simples |
Illegal trailing comma before end of objectExpected double-quoted property name | virgule finale |
Expecting ',' delimiterExpected ',' or '}' after property value | virgule manquante, ou nombre mal écrit (007, 1.) |
Expecting valueUnexpected token 'T', "{"ok": True}" is not valid JSON | valeur invalide : True, None, NaN (JS), 'x', .5… |
Expecting value: line 1 column 1 (char 0)Unexpected token '<', "<!DOCTYPE "… | réponse vide, ou page HTML reçue au lieu de JSON : vérifier le statut HTTP |
Invalid \escapeBad escaped character in JSON | \ isolé : chemin C:\dossier |
Invalid control character atBad control character in string literal | retour à la ligne brut dans une chaîne |
Extra dataUnexpected non-whitespace character after JSON | texte après la fin : documents collés, } en trop |
Unexpected UTF-8 BOM (decode using utf-8-sig)Unexpected token '', … | BOM (invisible) en tête du fichier |
—Unexpected end of JSON input | texte vide ou tronqué (réponse 204…) |
Messages suivis de la position : line 1 column 9 (char 8) · at position 8 (line 1 column 9). Les libellés varient selon les versions.
eval() pour lire du JSON : JSON.parse, json.loads.RecursionError).__proto__, constructor, prototype.< en \u003c pour neutraliser </script>.