Preciso colocar um objeto JSON em um atributo em um elemento HTML.
O HTML não precisa ser validado.Respondido por Quentin: Armazene o JSON em um
data-*
atributo , que é HTML5 válido.O objeto JSON pode ter qualquer tamanho - ou seja, enorme
Respondido por Maiku Mori: O limite para um atributo HTML é potencialmente de 65536 caracteres .
E se o JSON contiver caracteres especiais? por exemplo
{foo: '<"bar/>'}
Respondido por Quentin: Codifique a string JSON antes de colocá-la no atributo, conforme as convenções usuais. Para PHP, use a função .
htmlentities()
EDIT - Exemplo de solução usando PHP e jQuery
Escrevendo o JSON no 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 o 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
fonte
fonte
data-json
você deve usar$(this).data('json')
o jQuery para ajudá-lo nessa parte.Respostas:
Por que não? A validação é um controle de qualidade realmente fácil que detecta muitos erros. Use um
data-*
atributo HTML 5 .Eu não vi nenhuma documentação sobre os limites do navegador para tamanhos de atributos.
Se você os encontrar, armazene os dados em a
<script>
. Defina um objeto e mapeie os elementosid
para nomes de propriedades nesse objeto.Basta seguir as regras normais para incluir dados não confiáveis em valores de atributos. Use
&
e"
(se você estiver colocando o valor do atributo entre aspas duplas) ou'
(se estiver colocando o valor do atributo entre aspas simples).Observe, entretanto, que isso não é JSON (que requer que os nomes das propriedades sejam strings e que as strings sejam delimitadas apenas com aspas duplas).
fonte
htmlentities($json)
antes de colocá-lo no atributo HTML? E então como faço para decodificar isso quando quero ler no jQuery? E então como faço para escrever de volta usando jQuery da mesma forma que era em PHP?Dependendo de onde você o colocar,
<div>
solicitado, você precisa garantir que o JSON não contenha especiais HTML que possam iniciar uma tag, comentário HTML, tipo de documento incorporado, etc. Você precisa pelo menos escapar<
e&
forma que o caractere original não aparecem na sequência de escape.<script>
elementos, você precisa garantir que o JSON não contenha uma tag de finalização</script>
ou limite de texto de escape:<!--
ou-->
."
ou'
).Para os dois primeiros casos (e para analisadores JSON antigos), você deve codificar U + 2028 e U + 2029, pois esses são caracteres de nova linha em JavaScript, embora sejam permitidos em strings não codificadas em JSON.
Para correção, você precisa escapar
\
e aspas JSON e nunca é uma má ideia sempre codificar NUL.Se o HTML pode ser servido sem uma codificação de conteúdo, você deve codificar
+
para evitar ataques UTF-7 .Em qualquer caso, a seguinte tabela de escape funcionará:
\u0000
\n
ou\u000a
\r
ou\u000d
"
->\u0022
&
->\u0026
'
->\u0027
+
->\u002b
/
->\/
ou\u002f
<
->\u003c
>
->\u003e
\
->\\
ou\u005c
\u2028
\u2029
Portanto, o valor da string JSON para o texto
Hello, <World>!
com uma nova linha no final seria"Hello, \u003cWorld\u003e!\r\n"
.fonte
return (input.replace(/([\s"'
& + \ / \\ <> \ u2028 \ u2029 \ u0000]) / g, (combinar, p1) => {retornar\\u${p1.codePointAt(0).toString(16).padStart(4, 0)}
; })); `Outra maneira de fazer isso é colocar os dados json dentro da
<script>
tag, mas não comtype="text/javascript"
, mas comtype="text/bootstrap"
outype="text/json"
tipo, para evitar a execução de javascript.Então, em algum lugar do seu programa, você pode solicitá-lo desta forma:
No lado do servidor, você pode fazer algo assim (este exemplo com php e twig ):
fonte
<script type="application/json" id="MyData"></script>
funciona perfeitamente. Em seguida, usando ActiveWAFL / DblEj, posso procurá-lo com:document.GetData("#MyData")
.<script type="application/json" id="MyData"> "abc</script><script>alert()</script>" </script>
Outra opção é codificar em base64 a string JSON e, se precisar usá-la em seu javascript, decodifique-a com a
atob()
função.fonte
atob
. Nunca me dei conta disso!Você pode usar knockoutjs,
knockout.js
Resultado
Primeiro nome: Jayson Sobrenome: Monterroso
Verifique isto: http://learn.knockoutjs.com/
fonte
Nada extravagante aqui. No PHP, dê uma olhada na string JSON
htmlspecialchars
para garantir que nenhum caractere especial possa ser interpretado como HTML. Do Javascript, nenhum escape é necessário; basta definir o atributo e pronto.fonte
Para objetos JSON simples, o código abaixo funcionaria.
Codificar:
Decodificar:
fonte
O que você pode fazer é usar cdata em torno de seu (s) elemento (s) como este
onde mydata é uma string json bruta. Espero que isso ajude você e outras pessoas.
fonte
">
em meus dados?Outro pensamento que pode ser usado é armazenar os dados JSON como uma string base64 no atributo e, em seguida, usar
window.atob
ouwindow.btoa
para restaurá-los para dados JSON utilizáveis.fonte