Tengo una cadena en una aplicación de servidor Java a la que se accede mediante AJAX. Se parece 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 la cadena se extrae del servidor, ¿hay una manera fácil de convertir esto en un objeto (o matriz) de JavaScript vivo? ¿O tengo que dividir manualmente la cadena y construir mi objeto manualmente?
Respuestas:
Soporte de navegadores modernos
JSON.parse()
.En los navegadores que no lo hacen, puede incluir la
json2
biblioteca .fuente
El objetivo de JSON es que las cadenas JSON se pueden convertir en objetos nativos sin hacer nada. Mira este enlace
Puedes usar cualquiera
eval(string)
oJSON.parse(string)
.Sin embargo,
eval
es arriesgado. De json.org:fuente
¡Haz lo que hace jQuery! (la esencia)
De esta manera, no necesita ninguna biblioteca externa y todavía funciona en navegadores antiguos.
fuente
eval()
.PARA recopilar todos los elementos de una matriz y devolver un objeto json
PARA analizar los mismos datos que pasamos de esta manera
fuente
También podría usar,
eval()
peroJSON.parse()
es una forma más segura y fácil, entonces ¿por qué lo haría?bueno y funciona
No veo ninguna razón por la que preferiría usar
eval
. Solo pone su aplicación en riesgo.Dicho esto, esto también es posible.
malo, pero también funciona
¿Por qué es
eval
una mala idea?Considere el siguiente ejemplo.
Algunos terceros o usuarios proporcionaron datos de cadena JSON.
Su script del lado del servidor procesa esos datos.
Utilizando
JSON.parse
:arrojará:
La función no se ejecutará.
Estás seguro.
Utilizando
eval()
:ejecutará la función y devolverá el texto.
Si reemplazo esa función inofensiva con una que elimina archivos de la carpeta de su sitio web, ha sido pirateado. No se arrojarán errores / advertencias en este ejemplo.
NO estás 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, acabamos de ejecutar una función en nuestro servidor.Esto también podría evitarse si verificamos en el servidor todos los datos proporcionados por el usuario antes de pasarlos a una
eval()
función, pero ¿por qué no usar la herramienta integrada para analizar JSON y evitar todos estos problemas y peligros?fuente
Y si también desea que el objeto deserializado tenga funciones, puede usar mi pequeña herramienta: https://github.com/khayll/jsmix
fuente
Si pega la cadena en el lado del servidor en el html, no necesita hacer nada:
Para Java simple en jsp:
Para puntales de ancho jsp:
fuente
Creo que esto debería ayudar:
Además, la documentación también demuestra que puede usar require () para archivos json: https://www.bennadel.com/blog/2908-you-can-use-require-to-load-json-javascript-object-notation-files -in-node-js.htm
fuente