Comment corriger l'erreur Uncaught SyntaxError: Unexpected end of JSON input at JSON.parse ?

Le langage JavaScript et le format de données de JSON sont étroitement liés. C'est tout simplement le cas car le JSON est issu de la façon dont sont créés les objets dans le langage JavaScript. C'est pour cela que JSON est l'acronyme de "JavaScript Object Notation". On retrouve dans le langage JavaScript la fonction "JSON.parse()" pour transformer un fichier JSON en objet. Si vous obtenez le message d'erreur "Unexpected end of JSON input at JSON.parse", c'est qu'il y a un souci avec la chaîne JSON en paramètre.

La fonction JSON.parse() prend en paramètre une chaîne JSON valide. Le plus souvent, on peut s'en servir pour analyser une requête d'une API, ou bien le contenu d'un fichier JSON. Le message d'erreur survient si le format n'est pas valide. Vous ne pouvez pas lui passer une variable du langage JavaScript, à l'exception d'une chaîne de caractères contenant du JSON. Il faut également savoir que la fonction génère une erreur en cas de chaîne de caractères vide. C'est d'ailleurs le comportement qui se produit si vous lui passez un objet JavaScript : la fonction "JSON.parse()" le convertit en chaîne vide et essaie de l'analyser, ce qui provoque une erreur.

var chaine1 = '{"prenom": "Jean", "nom": "Dupont"}';
var chaine2 = {
    prenom : "Jean",
    nom : "Dupont"
}
//Fonctionne
var objet1 = JSON.parse(chaine1);
//Génère une erreur car le paramètre est déjà un objet JavaScript
var objet2 = JSON.parse(chaine2);

Certaines librairies proposent des fonctions plus poussées pour analyser le JSON provenant d'une source en particulier. La librairie jQuery propose la fonction "getJSON()" qui prend en paramètre une URL vers la ressource à récupérer, obligatoirement en JSON, puis une fonction qui va traiter le résultat. Vous n'avez pas besoin de faire appel à la fonction "JSON.parse()" sur le résultat de cette fonction car la librairie l'a déjà fait dans son propre code.

$.getJSON( "http://www.monsite.fr/test", function (data) {
  //C'est déjà un objet JavaScript, le parser comme du JSON est inutile et provoquera l'affichage du message d'erreur
  console.log(data);
});

JavaScript