usar objeto node crear convertir javascript json deserialization

node - Deserializar un JSON en un objeto JavaScript



object to json angular (8)

Tengo una cadena en una aplicación de servidor Java a la que se accede utilizando AJAX. Se parece algo a lo siguiente:

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" }];

Cuando se extrae la cadena del servidor, ¿hay una manera fácil de convertir esto en un objeto JavaScript vivo (o matriz)? ¿O tengo que dividir manualmente la cadena y construir mi objeto manualmente?



El punto central de JSON es que las cadenas JSON se pueden convertir en objetos nativos sin hacer nada. Revisa este enlace

Puede utilizar eval(string) o JSON.parse(string) .

Sin embargo, eval es arriesgado. De json.org:

La función eval es muy rápida. Sin embargo, puede compilar y ejecutar cualquier programa JavaScript, por lo que puede haber problemas de seguridad. El uso de eval se indica cuando la fuente es confiable y competente. Es mucho más seguro usar un analizador JSON. En las aplicaciones web sobre XMLHttpRequest, la comunicación se permite solo al mismo origen que proporciona esa página, por lo que es de confianza. Pero podría no ser competente. Si el servidor no es riguroso en su codificación JSON, o si no valida escrupulosamente todas sus entradas, entonces podría entregar un texto JSON no válido que podría contener un script peligroso. La función eval ejecutaría el script, desatando su malicia.


Haz como jQuery hace! (la esencia)

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 esta manera, no necesita ninguna biblioteca externa y aún funciona en navegadores antiguos.


Los navegadores modernos soportan JSON.parse() .

var arr_from_json = JSON.parse( json_string );

En los navegadores que no lo hacen, puede incluir la biblioteca json2 .


Para recopilar todos los elementos de una matriz y devolver un objeto 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; },

Para analizar los mismos datos que pasamos de esta manera

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) }); }); }


También puedes usar eval() pero JSON.parse() es una forma más segura y fácil, ¿por qué lo harías?

bien y funciona

var yourJsonObject = JSON.parse(json_as_text);

No veo ninguna razón por la que preferirías usar eval . Solo pone en riesgo tu aplicación.

Dicho esto, esto también es posible.

malo - pero también funciona

var yourJsonObject = eval(json_as_text);

¿Por qué es una mala idea eval ?

Considere el siguiente ejemplo.

Algunos terceros o usuario proporcionaron datos de cadena JSON.

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" }] `;

Su script del lado del servidor procesa esos datos.

Usando JSON.parse :

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

lanzará:

Uncaught SyntaxError: Unexpected token u in JSON at position X.

La función no se ejecutará.

Estás seguro.

Utilizando eval() :

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

Ejecutará la función y devolverá el texto.

Si sustituyo esa función inofensiva con una que elimina archivos de la carpeta de su sitio web, ha sido hackeado. No se arrojarán errores / advertencias en este ejemplo.

NO estas a salvo.

Pude manipular una cadena de texto JSON para que actúe como una función que se ejecutará en el servidor.

eval(JSON)[0].adjacencies[0].nodeTo espera procesar una cadena JSON pero, en realidad, solo ejecutamos una función en nuestro servidor.

Esto también podría evitarse si verificamos todos los datos proporcionados por el usuario del lado del servidor antes de pasarlo a una función eval() , pero ¿por qué no usar la herramienta integrada para analizar JSON y evitar todo este problema y peligro?


Y si también desea que el objeto deserializado tenga funciones, puede usar mi pequeña herramienta: 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 pega la cadena en el lado del servidor en el html no necesita hacer nada:

Para Java simple en jsp:

var jsonObj=<%=jsonStringInJavaServlet%>;

Para puntales de ancho jsp:

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