Question Transformer une chaîne JSON en toute sécurité en un objet


Étant donné une chaîne de données JSON, comment pouvez-vous transformer cette chaîne en un objet JavaScript en toute sécurité?

De toute évidence, vous pouvez le faire de façon imprévisible avec quelque chose comme ...

var obj = eval("(" + json + ')');

... mais cela nous laisse vulnérable à la chaîne json contenant un autre code, ce qui semble très dangereux à évaluer simplement.


1126
2017-09-05 00:12


origine


Réponses:


JSON.parse(jsonString) est une approche purement JavaScript tant que vous pouvez garantir un navigateur raisonnablement moderne.


1699
2018-04-16 11:45



La méthode jQuery est maintenant obsolète. Utilisez cette méthode à la place:

let jsonObject = JSON.parse(jsonString);

Réponse originale utilisant la fonctionnalité obsolète jQuery:

Si vous utilisez jQuery, utilisez simplement:

jQuery.parseJSON( jsonString );

C'est exactement ce que vous cherchez (voir le jQuery Documentation).


855
2017-09-02 14:07



Edit: Cette réponse est pour IE <7, pour les navigateurs modernes, vérifiez la réponse de Jonathan ci-dessus.

Edit: Cette réponse est obsolète et La réponse de Jonathan ci-dessus (JSON.parse(jsonString)) est maintenant le meilleure réponse.

JSON.org a des analyseurs JSON pour de nombreuses langues dont 4 différentes pour Javascript. Je crois que la plupart des gens considéreraient json2.js leur mise en œuvre goto.


138
2017-09-05 00:13



Utilisez un code simple représenté ci-dessous lien sur MSDN.

var jsontext = '{"firstname":"Jesper","surname":"Aaberg","phone":["555-0100","555-0120"]}';
var contact = JSON.parse(jsontext);

et inverser

var str = JSON.stringify(arr);

61
2017-12-15 23:26



Je ne suis pas sûr d'autres façons de le faire, mais voici comment vous le faites dans Prototype (tutoriel JSON).

new Ajax.Request('/some_url', {
  method:'get',
  requestHeaders: {Accept: 'application/json'},
  onSuccess: function(transport){
    var json = transport.responseText.evalJSON(true);
  }
});

Appel evalJSON () avec true car l'argument assainit la chaîne entrante.


17
2017-09-05 00:13



Cela semble être le problème:

Une entrée est reçue, via ajax websocket etc, et elle sera toujours au format String - mais vous devez savoir si c'est JSON.parsable. Touble est, que si vous l'exécutez toujours à travers un JSON.parse, le programme PEUT continuer "avec succès" mais vous verrez toujours une erreur lancée dans la console avec la redoutée "Erreur: jeton inattendu" x "".

var data;

try {
  data = JSON.parse(jqxhr.responseText);
} catch (_error) {}

data || (data = {
  message: 'Server error, please retry'
});

15
2018-04-29 07:37



Si vous utilisez jQuery, vous pouvez aussi juste faire $.getJSON(url, function(data) { });

Ensuite, vous pouvez faire des choses comme data.key1.something, data.key1.something_else, etc.


11
2017-10-24 13:57



$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

Le callback est passé les données retournées, qui seront un objet JavaScript ou un tableau tel que défini par la structure JSON et analysé en utilisant le $.parseJSON() méthode.


10
2018-05-06 06:23