Désérialiser un JSON dans un objet JavaScript

J'ai une chaîne dans une application de serveur Java accessible via AJAX. Il ressemble à ce qui suit:

var json = [{ "adjacencies": [ { "nodeTo": "graphnode2", "nodeFrom": "graphnode1", "data": { "$color": "#557EAA" } } ], "data": { "$color": "#EBB056", "$type": "triangle", "$dim": 9 }, "id": "graphnode1", "name": "graphnode1" },{ "adjacencies": [], "data": { "$color": "#EBB056", "$type": "triangle", "$dim": 9 }, "id": "graphnode2", "name": "graphnode2" }]; 

Lorsque la chaîne est extraite du serveur, existe-t-il un moyen simple de transformer cela en un objet JavaScript vivant (ou un tableau)? Ou dois-je répartir manuellement la chaîne et construire mon objet manuellement?

Les navigateurs modernes prennent en charge JSON.parse() .

 var arr_from_json = JSON.parse( json_string ); 

Dans les navigateurs qui ne le sont pas, vous pouvez inclure la bibliothèque json2 .

Le point entier de JSON est que les chaînes JSON peuvent être converties en objets natifs sans rien faire. Vérifiez ce lien

Vous pouvez utiliser eval (string) ou JSON.parse (chaîne).

Cependant, eval est risqué. De json.org

La fonction eval est très rapide. Cependant, il peut compiler et exécuter tout programme JavaScript, donc il peut y avoir des problèmes de sécurité. L'utilisation d'eval est indiquée lorsque la source est digne de confiance et compétente. Il est beaucoup plus sûr d'utiliser un analyseur JSON. Dans les applications Web sur XMLHttpRequest, la communication est autorisée uniquement à la même origine qui fournit cette page, de sorte qu'il est fait confiance. Mais ce n'est peut-être pas compétent. Si le serveur n'est pas rigoureux dans son codage JSON, ou s'il ne valide pas scrupuleusement toutes ses entrées, il pourrait fournir un texte JSON invalide qui pourrait transporter un script dangereux. La fonction eval exécuterait le script, libérant sa malice.

Faites comme jQuery! (l'essence)

 function parseJSON(data) { return window.JSON && window.JSON.parse ? window.JSON.parse( data ) : (new Function("return " + data))(); } // testing obj = parseJSON('{"name":"John"}'); alert(obj.name); 

De cette façon, vous n'avez besoin d'aucune bibliothèque externe et fonctionne toujours sur les anciens navigateurs.

Pour collecter tous les éléments d'un tableau et renvoyer un objet json

 collectData: function (arrayElements) { var main = []; for (var i = 0; i < arrayElements.length; i++) { var data = {}; this.e = arrayElements[i]; data.text = arrayElements[i].text; data.val = arrayElements[i].value; main[i] = data; } return main; }, 

Pour analyser les mêmes données, nous passons comme ça

 dummyParse: function (json) { var o = JSON.parse(json); //conerted the string into JSON object $.each(o, function () { inner = this; $.each(inner, function (index) { alert(this.text) }); }); } 

Vous pouvez également utiliser eval () mais JSON.parse () est plus sûr et plus facile, alors pourquoi …

Bon et fonctionne

 var yourJsonObject = JSON.parse(json_as_text); 

Je ne vois aucune raison pour laquelle vous préférez utiliser eval, mais seulement met votre application en danger. Cela dit … il suffit de savoir que cela est également possible.

Mauvais – mais fonctionne aussi

 var yourJsonObject = eval(json_as_text); 

Pourquoi eval est une mauvaise idée? Considérons l'exemple suivant:

Certaines données de chaîne json fournies par un tiers ou par l'utilisateur

 var json = ` [{ "adjacencies": [ { "nodeTo": function(){ return "delete server files - you have been hacked!"; }(), "nodeFrom": "graphnode1", "data": { "$color": "#557EAA" } } ], "data": { "$color": "#EBB056", "$type": "triangle", "$dim": 9 }, "id": "graphnode1", "name": "graphnode1" },{ "adjacencies": [], "data": { "$color": "#EBB056", "$type": "triangle", "$dim": 9 }, "id": "graphnode2", "name": "graphnode2" }] `; 

Le script côté serveur qui traite ces données

Alors que JSON.parse jette Uncaught SyntaxError: Un jeton inattendu dans JSON à la position X. La fonction ne sera pas exécutée – Vous êtes en sécurité .

 window.onload = function(){ var placeholder = document.getElementById('placeholder1'); placeholder.innerHTML = JSON.parse(json)[0].adjacencies[0].nodeTo; } 

Eval () exécutera la fonction et renverra le texte. Imagin que je place le script pour supprimer des fichiers de votre dossier de site Web – piraté . Aucune erreur / avertissement ne sera lancé dans cet exemple.

 window.onload = function(){ var placeholder = document.getElementById('placeholder1'); placeholder.innerHTML = eval(json)[0].adjacencies[0].nodeTo; } 

Donc, basique, j'ai pu manipuler la chaîne de texte json de manière à fonctionner comme un functino qui s'exécute sur le serveur tout en étant accouplé comme données de chaîne régulières. En appelant eval(json)[0].adjacencies[0].nodeTo Nous espérons pouvoir accéder à la chaîne json, mais en réalité, nous avons simplement exécuté une fonction sur notre serveur. Cela pourrait également être évité si nous vérifions les données fournies par l'utilisateur tout en étant une chaîne avant de passer à la fonction eval () .

Et si vous voulez également que l'objet désérialisé ait des fonctions, vous pouvez utiliser mon petit outil: https://github.com/khayll/jsmix

 //first you'll need to define your model var GraphNode = function() {}; GraphNode.prototype.getType = function() { return this.$type; } var Adjacency = function() {}; Adjacency.prototype.getData =n function() { return this.data; } //then you could say: var result = JSMix(jsonData) .withObject(GraphNode.prototype, "*") .withObject(Adjacency.prototype, "*.adjacencies") .build(); //and use them console.log(result[1][0].getData()); 

Si vous collez la chaîne dans le serveur dans le html, n'avez pas besoin de rien faire:

Pour java simple dans jsp:

 var jsonObj=<%=jsonStringInJavaServlet%>; 

Pour les jambes de jupes jsp:

 var jsonObj=<s:property value="jsonStringInJavaServlet" escape="false" escapeHtml="false"/>; 

Je pense que cela devrait aider:

De plus, les documentations prouvent que vous pouvez utiliser require () pour les fichiers json: https://www.bennadel.com/blog/2908-you-can-use-require-to-load-json-javascript-object-notation-files -in-node-js.htm

 var jsonfile = require("./path/to/jsonfile.json"); node = jsonfile.adjacencies.nodeTo; node2 = jsonfile.adjacencies.nodeFrom; node3 = jsonfile.adjacencies.data.$color; //other things.