84 votes

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

Mon JavaScript se bloque parfois sur cette ligne :

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

Des crashs sont provoqués lorsque l'argument de eval() n'est pas JSON. Existe-t-il un moyen de vérifier si la chaîne est JSON avant d'effectuer cet appel ?

Je ne veux pas utiliser de framework - y a-t-il un moyen de faire fonctionner ce système en utilisant seulement eval() ? (Il y a une bonne raison, je vous le promets.)

0 votes

Vous pourriez essayer de JSON.parse() dans un try/catch... si vous arrivez à catch, c'est que le balisage JSON n'est pas valide. Bien sûr, c'est un peu inefficace, heh... Pourriez-vous me donner un exemple du balisage JSON invalide que vous obtenez ?

158voto

inkedmn Points 12655

Si vous incluez le Analyseur JSON de json.org, vous pouvez utiliser sa 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 pourrait probablement faire ce que vous voulez.

10 votes

En utilisant jQuery.parseJSON(..) vous n'auriez pas besoin d'inclure json.org

1 votes

@Raymo L'OP n'a pas mentionné l'utilisation de jQuery et de json2.js qui fait moins de la moitié de la taille de jQuery (en termes de taille de fichier).

0 votes

L'analyse d'une chaîne entière est une mauvaise pratique, et le fait de lancer une exception peut provoquer des retards.

22voto

Ray L Points 2168

Hers est l'alternative jQuery...

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

16voto

Håvard S Points 11152

Je vous recommande vivement d'utiliser un bibliothèque javascript JSON pour la sérialisation depuis et vers JSON. eval() est un risque de sécurité qui ne devrait jamais être utilisé à moins que vous ne soyez absolument certain que son entrée est nettoyée et sûre.

Si une bibliothèque JSON est en place, il suffit d'envelopper l'appel à sa bibliothèque parse() équivalent dans un bloc try/catch pour gérer les entrées non-JSON :

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

2voto

Peut-être que cela aide : Avec ce code, vous pouvez obtenir directement vos données

<!DOCTYPE html>
<html>
<body>

<h3>Open console, please, to view result!</h3>
<p id="demo"></p>

<script>
var tryJSON = function (test) {
    try {
        JSON.parse(test);
    }
    catch(err) {
        // maybe you need to escape this… (or not)
        test = '"'+test.replace(/\\?"/g,'\\"')+'"';
    }
    eval('test = '+test);
    console.debug('Try json:', test);
};

// test with string…
var test = 'bonjour "mister"';
tryJSON(test);
// test with JSON…
var test = '{"fr-FR": "<p>Ceci est un texte en français !</p>","en-GB": "<p>And here, a text in english!</p>","nl-NL": "","es-ES": ""}';
tryJSON(test);
</script>

</body>
</html>

0 votes

Il existe de nombreuses autres façons d'obtenir le même résultat, l'utilisation de eval() étant probablement la moins appropriée.

1voto

Hesham Yassin Points 362

Le problème de dépendre de la try-catch L'approche est la suivante JSON.parse('123') = 123 et il ne lèvera pas d'exception. Par conséquent, en plus de la 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'
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X