Necesito poner un objeto JSON en un atributo en un elemento HTML.
El HTML no tiene que validar.Respondido por Quentin: Almacene el JSON en un
data-*
atributo , que es HTML5 válido.El objeto JSON podría tener cualquier tamaño, es decir, enorme
Respuesta de Maiku Mori: El límite para un atributo HTML es potencialmente de 65536 caracteres .
¿Qué pasa si el JSON contiene caracteres especiales? p.ej
{foo: '<"bar/>'}
Respondido por Quentin: Codifique la cadena JSON antes de ponerla en el atributo, según las convenciones habituales. Para PHP, use la función .
htmlentities()
EDITAR - Solución de ejemplo usando PHP y jQuery
Escribiendo el JSON en el atributo HTML:
<?php
$data = array(
'1' => 'test',
'foo' => '<"bar/>'
);
$json = json_encode($data);
?>
<a href="#" data-json="<?php echo htmlentities($json, ENT_QUOTES, 'UTF-8'); ?>">CLICK ME</a>
Recuperando el JSON usando jQuery:
$('a').click(function() {
// Read the contents of the attribute (returns a string)
var data = $(this).data('json');
// Parse the string back into a proper JSON object
var json = $.parseJSON($(this).data('json'));
// Object now available
console.log(json.foo);
});
javascript
php
html
json
BadHorsie
fuente
fuente
data-json
que debe usar$(this).data('json')
, jQuery lo tiene cubierto en esa parte.Respuestas:
Por qué no? La validación es un control de calidad realmente fácil que detecta muchos errores. Utilice un
data-*
atributo HTML 5 .No he visto ninguna documentación sobre los límites del navegador para los tamaños de los atributos.
Si se encuentra con ellos, almacene los datos en un archivo
<script>
. Defina un objeto y asigne elementosid
a los nombres de propiedad en ese objeto.Simplemente siga las reglas normales para incluir datos que no sean de confianza en los valores de los atributos. Use
&
y"
(si está envolviendo el valor del atributo entre comillas dobles) o'
(si está envolviendo el valor del atributo entre comillas simples).Sin embargo, tenga en cuenta que eso no es JSON (que requiere que los nombres de propiedad sean cadenas y que las cadenas estén delimitadas solo con comillas dobles).
fuente
htmlentities($json)
antes de ponerlo en el atributo HTML? ¿Y luego cómo decodifico eso cuando quiero leerlo en jQuery? Y luego, ¿cómo lo vuelvo a escribir usando jQuery de la misma manera que estaba en PHP?Dependiendo de donde lo pongas
<div>
lo solicitó, debe asegurarse de que el JSON no contenga especiales HTML que puedan iniciar una etiqueta, comentario HTML, tipo de documento incrustado, etc. Debe escapar al menos<
, y&
de tal manera que el carácter original no lo haga aparecen en la secuencia de escape.<script>
elementos, debe asegurarse de que JSON no contenga una etiqueta final</script>
o un límite de texto de escape:<!--
o-->
."
o'
).Para los dos primeros casos (y para los analizadores JSON antiguos), debe codificar U + 2028 y U + 2029, ya que son caracteres de nueva línea en JavaScript, aunque están permitidos en cadenas no codificadas en JSON.
Para que sea correcto, debe usar caracteres de escape
\
y comillas JSON y nunca es una mala idea codificar siempre NUL.Si es posible que el HTML se sirva sin codificación de contenido, debe codificarlo
+
para evitar ataques UTF-7 .En cualquier caso, la siguiente tabla de escape funcionará:
\u0000
\n
o\u000a
\r
o\u000d
"
->\u0022
&
->\u0026
'
->\u0027
+
->\u002b
/
->\/
o\u002f
<
->\u003c
>
->\u003e
\
->\\
o\u005c
\u2028
\u2029
Entonces, el valor de cadena JSON para el texto
Hello, <World>!
con una nueva línea al final sería"Hello, \u003cWorld\u003e!\r\n"
.fuente
return (input.replace(/([\s"'
& + \ / \\ <> \ u2028 \ u2029 \ u0000]) / g, (coincidencia, p1) => {return\\u${p1.codePointAt(0).toString(16).padStart(4, 0)}
; })); `Otra forma de hacerlo es poner los datos json dentro de la
<script>
etiqueta, pero no contype="text/javascript"
, sino contype="text/bootstrap"
otype="text/json"
tipo, para evitar la ejecución de JavaScript.Luego, en algún lugar de tu programa, puedes solicitarlo de esta manera:
En el lado del servidor, puede hacer algo como esto (este ejemplo con php y twig ):
fuente
<script type="application/json" id="MyData"></script>
funciona perfectamente. Luego, utilizando ActiveWAFL / DblEj, puedo mirar hacia arriba con:document.GetData("#MyData")
.<script type="application/json" id="MyData"> "abc</script><script>alert()</script>" </script>
Otra opción es codificar en base64 la cadena JSON y, si necesita usarla en su javascript, decodificarla con la
atob()
función.fuente
atob
. ¡Nunca me di cuenta de eso!Puedes usar knockoutjs,
knockout.js
Salida
Nombre: Jayson Apellido: Monterroso
Compruebe esto: http://learn.knockoutjs.com/
fuente
Nada especial aquí. Desde PHP, ejecute la cadena JSON
htmlspecialchars
para asegurarse de que ningún carácter especial pueda interpretarse como HTML. Desde Javascript, no es necesario escapar; solo establece el atributo y listo.fuente
Para objetos JSON simples, el siguiente código funcionaría.
Codificar:
Descodificar:
fuente
Lo que puede hacer es usar cdata alrededor de su elemento / s de esta manera
donde mydata es una cadena json sin procesar. Espero que esto te ayude a ti y a los demás.
fuente
">
en mydata?Otro pensamiento que podría usarse es almacenar los datos JSON como una cadena base64 en el atributo y luego usar
window.atob
owindow.btoa
restaurarlos a datos JSON utilizables.fuente