← Tous les articles

Chaîne non terminée en JSON : causes et correctifs

Une chaîne non terminée en JSON signifie qu'un guillemet ouvrant n'a pas de guillemet fermant — souvent un guillemet non échappé, un saut de ligne brut ou des données tronquées. Exemples cassés et corrigés.

SyntaxError: Unterminated string in JSON at position N signifie que le parser a commencé à lire une chaîne (a vu un " d’ouverture) et a atteint la fin de l’entrée —— ou un saut de ligne —— avant de trouver le " de fermeture. La chaîne n’a jamais été refermée. Voici pourquoi et comment corriger.

Quelle erreur de chaîne est-ce que je vois ?

  • Unterminated string —— une chaîne a été ouverte avec " mais jamais refermée.
  • Bad control character —— une tabulation/un retour à la ligne/un octet null brut se trouve à l’intérieur d’une chaîne, sans échappement.
  • Bad escaped character —— un \ est suivi de quelque chose que JSON n’autorise pas (par ex. \x, chemins Windows).

À quoi ressemble l’erreur

// V8 (Chrome / Node / Edge)
SyntaxError: Unterminated string in JSON at position 27

// Firefox
SyntaxError: JSON.parse: unterminated string at line 2 column 10 of the JSON data

// Safari
SyntaxError: JSON Parse error: Unterminated string

La position désigne (ou juste après) le guillemet d’ouverture de la chaîne jamais refermée —— avancez à partir de là.

Pourquoi ça arrive

Cause 1 —— Un guillemet non échappé referme la chaîne trop tôt

Un " littéral dans la valeur referme la chaîne prématurément ; le reste de la ligne est lu comme des tokens inattendus, et la vraie chaîne reste « ouverte ».

// ❌ cassé —— le guillemet avant hello referme "He said "
{ "note": "He said "hello" to her" }

// ✅ corrigé —— échappez les guillemets internes avec un antislash
{ "note": "He said \"hello\" to her" }

Cause 2 —— Un saut de ligne brut dans la chaîne

Les chaînes JSON ne peuvent pas enjamber un saut de ligne brut. Un saut littéral termine la chaîne et la laisse non refermée.

// ❌ cassé —— vrai saut de ligne dans la chaîne
{ "bio": "line one
line two" }

// ✅ corrigé —— utilisez l’échappement \n, pas de saut brut
{ "bio": "line one\nline two" }

Cause 3 —— Données tronquées

Une réponse coupée en plein milieu d’une chaîne (connexion perdue, limite de buffer/taille, lecture partielle) laisse une chaîne ouverte à la fin de l’entrée.

// ce qui est arrivé (connexion coupée) :
{"user":{"name":"Ada Lovel
// → Unterminated string

Comment corriger —— étape par étape

  1. Allez à la position signalée et trouvez le " d’ouverture sans fermeture correspondante.
  2. Cherchez un " non échappé dans la valeur —— échappez-le en \".
  3. Cherchez un saut de ligne/tab brut dans la valeur —— remplacez-le par \n / \t.
  4. Vérifiez la troncature —— comparez la longueur en octets à Content-Length ; si elle est plus courte, les données ont été coupées (correction code, pas correction texte).
  5. Arrêtez de bâtir du JSON à la main. Utilisez JSON.stringify(), qui échappe les guillemets et les caractères de contrôle pour vous.
// Prévention : ne concaténez jamais des chaînes pour faire du JSON
const json = JSON.stringify({ note: userInput }); // toujours valide

Questions fréquentes

Qu’est-ce qui cause « Unterminated string in JSON » ?

Un " d’ouverture sans " de fermeture correspondante —— le plus souvent un guillemet non échappé dans la valeur, un saut de ligne brut, ou une réponse coupée en pleine chaîne.

Comment inclure un guillemet ou un saut de ligne dans une chaîne JSON ?

Échappez-les : \" pour un guillemet double, \n pour un saut de ligne, \t pour une tabulation. Construire le JSON avec JSON.stringify() le fait automatiquement.

Est-ce la même chose que « Unexpected end of JSON input » ?

Liés mais distincts. « Unterminated string » signifie qu’une chaîne est ouverte ; « Unexpected end of JSON input » signifie que toute la structure (objet/tableau) s’est terminée trop tôt. Les réponses tronquées peuvent déclencher l’une ou l’autre.

Corriger maintenant