AJAX: Vérifiez si une chaîne est JSON?

Mon JavaScript se bloque parfois sur cette ligne:

var json = eval('(' + this.responseText + ')'); 

Les pannes sont provoquées lorsque l’argument de eval() n’est pas JSON. Est-il possible de vérifier si la chaîne est JSON avant de lancer cet appel?

Je ne veux pas utiliser de framework – y a-t-il un moyen de faire ce travail en utilisant juste eval() ? (Il y a une bonne raison, je le promets)

Si vous incluez l’ parsingur JSON de json.org, vous pouvez utiliser la fonction parse () et l’envelopper dans un try / catch, comme ceci:

 try { var json = JSON.parse(this.responseText); } catch(e) { alert('invalid json'); } 

Quelque chose comme ça ferait probablement ce que vous voulez.

C’est l’alternative jQuery …

 try { var jsonObject = jQuery.parseJSON(yourJsonSsortingng); } catch(e) { // handle error } 

Je vous recommande vivement d’utiliser une bibliothèque JSON JavaScript pour la sérialisation vers et depuis JSON. eval() est un risque de sécurité qui ne devrait être utilisé que si vous êtes absolument certain que son entrée est assainie et sûre.

Avec une bibliothèque JSON en place, placez simplement l’appel à son équivalent parse() dans un bloc try / catch pour gérer les entrées non-JSON:

 try { var jsonObject = JSON.parse(yourJsonSsortingng); } catch(e) { // handle error } 

Promise au lieu de Try-catch :

 npm install is-json-promise ; //for NodeJS environment. 

OU

 Ssortingng.IsJSON = (candidate) => new Promise( (resolve, reject) => resolve(JSON.parse(candidate)) ) ; 

Cas d’utilisation:

 Ssortingng.IsJSON(`iam here`) .then((object) => console.info(object)) .catch((error) => alert('Waww, i cannot be JSON')) ; // promise will run catch 

ou

 Ssortingng.IsJSON(`{"welcome":"Hello"}`) .then((object) => console.info(object)) // promise will run "then" .catch((error) => alert('Waww, i cannot be JSON')) ; 

Le problème avec l’approche try-catch est que JSON.parse('123') = 123 et qu’il ne lancera pas d’exception. Par conséquent, en plus du try-catch , nous devons vérifier le type comme suit:

 function isJsonStr(str) { var parsedStr = str; try { parsedStr = JSON.parse(str); } catch (e) { return false; } return typeof parsedStr == 'object' }