Intermédiaire 8 min de lecture 25 janvier 2025

JSON encodage : comprendre, éviter les pièges et réussir vos échanges

Tout semble correct, mais votre API refuse la requête, JSON.parse échoue ou des accents s'affichent en �. Le point sensible est souvent l'encodage JSON. Il repose sur l'UTF‑8, un échappement précis et des règles strictes. Voici l'essentiel pour éviter les erreurs et fiabiliser vos données.

Qu'est-ce que l'encodage JSON ?

C'est la manière de représenter des données en texte UTF‑8 avec une syntaxe et un échappement stricts, afin d'être lus de façon identique par toutes les plateformes.

Voici les points clés à maîtriser pour un encodage JSON fiable :

1 Structure JSON et jeu de caractères

UTF‑8 obligatoire, guillemets doubles, virgules, deux-points et types primitifs.

UTF‑8, { }, [ ], " ", :, ,, true, false, null

2 Caractères à échapper

Certains caractères doivent être encodés avec des séquences d'échappement.

\" \\ \b \f \n \r \t et U+0000 à U+001F via \u00XX

3 Unicode, accents et emojis

Présents partout dans les interfaces modernes, ils exigent un UTF‑8 propre.

Accents (é, à, ñ) et lettres non-ASCII
Emojis et paires de substituts (surrogates)
NBSP (U+00A0) et espaces spéciaux
Marques combinantes et normalisation (NFC/NFKC)

4 BOM et contraintes techniques

Détails qui cassent souvent la lecture côté client ou serveur :

BOM (U+FEFF) en tête de fichier JSON
NaN/Infinity non autorisés
Virgules finales interdites
Ordre des clés non garanti

Problèmes classiques

Accents ou emojis mal encodés

Provoque JSON_ERROR_UTF8 en PHP, des symboles � ou un échec de parsing.

Double encodage

Une chaîne déjà JSON est encodée une seconde fois, les antislashs se multiplient.

BOM ou en-têtes incorrects

Un BOM au début ou un mauvais Content-Type casse parse() côté client.

Caractères de contrôle non filtrés

U+0000 à U+001F interdits (hors \t \n \r) rendent le JSON invalide.

Exemple de problème courant :

# JSON paraît identique, mais l'un est doublement encodé
string1 = "{\"email\":\"email@domain.com\"}"
string2 = "\"{\\\"email\\\":\\\"email@domain.com\\\"}\"" # encodé deux fois
assert string1 == string2 # ❌ Échec

Symptômes qui doivent vous alerter

🚨 Signaux d'alarme

!
JSON.parse ou jq renvoie une erreur “Unexpected token”
!
fetch().json() rejette alors que la réponse HTTP est 200
!
Des antislashs en double ou des guillemets échappés partout dans la sortie
!
Des caractères � apparaissent à la place des accents
!
Un copier-coller du JSON dans Postman ou le terminal échoue à valider

Comment les détecter

Solution recommandée : Clean ASCII

Clean ASCII met en évidence tout ce qui fait dérailler l'encodage JSON : caractères hors UTF‑8, contrôles interdits, espaces spéciaux et BOM. Vous voyez immédiatement ce qui doit être corrigé avant l'encodage.

✅ Détection automatique

UTF‑8 invalide, BOM, caractères de contrôle, NBSP et espaces spéciaux

📊 Analyse complète

Codes Unicode, positions exactes, suggestions d’échappement JSON

🧹 Nettoyage automatique

Conversion vers UTF‑8 valide, remplacement des caractères interdits

💾 Export propre

Sortie prête pour json_encode/json.dumps sans surprises

Autres méthodes de détection

Affichage dans l'éditeur

Activez "render whitespace/control characters" et la coloration JSON
Extensions de validation JSON (schémas, lint) dans VS Code/JetBrains

En ligne de commande (Unix)

# Valider un fichier JSON
jq -e . fichier.json
# Détecter un BOM UTF-8
grep -U $'\xEF\xBB\xBF' -l fichier.json || true
# Afficher les caractères de contrôle
cat -A fichier.json
# Voir les codes hexadécimaux
hexdump -C fichier.json

En code

JavaScript

const json = JSON.stringify(obj, null, 2) // UTF‑8 + échappement standard

Python

json.dumps(data, ensure_ascii=False)

Excel / Google Sheets

CODE(MID(cellule;position;1))

Nettoyer et prévenir

🚀 Solution rapide avec Clean ASCII

Avant d'encoder en JSON, utilisez Clean ASCII pour assainir vos chaînes et supprimer tout ce qui ferait échouer l'encodage ou la lecture côté client.

Détection UTF‑8 et BOM
Échappement/filtrage correct
Export prêt pour JSON

Méthodes techniques avancées

🔧 Normaliser

Forcez UTF‑8 partout (Content‑Type: application/json; charset=utf-8)
Supprimez les BOM dans les flux et fichiers JSON
Appliquez Unicode NFC/NFKC pour éviter les formes équivalentes

🧹 Filtrer

Écrivez des fonctions sanitize_json_text() pour retirer U+0000..U+001F (hors \t \n \r)
Remplacez NBSP par espace simple avant l'encodage
Utilisez les options d'encodage adaptées (ex. JSON_UNESCAPED_UNICODE en PHP)

⚙️ Automatiser

Hooks pre-commit qui valident les JSON (jq -e .)
Tests qui utilisent JSON_THROW_ON_ERROR (PHP) ou jsonschema
Linting/validation JSON dans la CI

Checklist rapide

JSON en UTF‑8 sans BOM
En-têtes HTTP corrects (application/json; charset=utf-8)
Encodage avec gestion d'erreurs (JSON_THROW_ON_ERROR, try/catch)
Validation automatique via jq/jsonlint
Filtrage des caractères de contrôle et espaces spéciaux
Documentation interne sur l'encodage et l’échappement JSON

Conclusion

L'encodage JSON paraît simple, mais entre UTF‑8, BOM et échappement, les pièges sont réels. En le maîtrisant, vous sécurisez vos APIs, vos logs et vos interfaces.

Mettez en place une validation systématique, encodez en UTF‑8 et automatisez les contrôles : vous éviterez l'immense majorité des erreurs de parsing et d’affichage.

Analysez l'encodage JSON maintenant

Utilisez notre outil pour vérifier et assainir vos chaînes avant json_encode ou JSON.parse.

Analyser mon JSON