J'ai besoin de mettre un objet JSON dans un attribut sur un élément HTML.
Le HTML n'a pas à valider.Réponse de Quentin: Stockez le JSON dans un
data-*
attribut , qui est HTML5 valide.L'objet JSON peut être de n'importe quelle taille - c'est-à-dire énorme
Réponse de Maiku Mori: La limite pour un attribut HTML est potentiellement de 65 536 caractères .
Et si le JSON contient des caractères spéciaux? par exemple
{foo: '<"bar/>'}
Réponse de Quentin: Encodez la chaîne JSON avant de la mettre dans l'attribut, selon les conventions habituelles. Pour PHP, utilisez la fonction .
htmlentities()
EDIT - Exemple de solution utilisant PHP et jQuery
Écriture du JSON dans l'attribut 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>
Récupération du JSON à l'aide de 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
la source
la source
data-json
vous devez utiliser$(this).data('json')
, le jQuery vous a couvert sur cette partie.Réponses:
Pourquoi pas? La validation est un contrôle qualité très simple qui détecte de nombreuses erreurs. Utilisez un
data-*
attribut HTML 5 .Je n'ai vu aucune documentation sur les limites du navigateur pour les tailles d'attributs.
Si vous les rencontrez, stockez les données dans un fichier
<script>
. Définissez un objet et mappez les élémentsid
aux noms de propriété de cet objet.Suivez simplement les règles normales pour inclure des données non fiables dans les valeurs d'attribut. Utilisez
&
and"
(si vous encapsulez la valeur d'attribut entre guillemets doubles) ou'
(si vous encapsulez la valeur d'attribut entre guillemets simples).Notez, cependant, qu'il ne s'agit pas de JSON (ce qui nécessite que les noms de propriété soient des chaînes et que les chaînes ne soient délimitées que par des guillemets doubles).
la source
htmlentities($json)
avant de le mettre dans l'attribut HTML? Et puis comment décoder cela quand je veux le lire dans jQuery? Et puis comment le réécrire en utilisant jQuery de la même manière qu'en PHP?Selon l'endroit où vous le mettez,
<div>
comme vous l'avez demandé, vous devez vous assurer que le JSON ne contient pas de spéciaux HTML qui pourraient commencer une balise, un commentaire HTML, un doctype intégré, etc. Vous devez au moins échapper<
, et&
de telle sorte que le caractère d'origine ne apparaissent dans la séquence échappée.<script>
éléments, vous devez vous assurer que le JSON ne contient pas de balise de fin</script>
ou de limite de texte d'échappement:<!--
ou-->
."
ou'
).Pour les deux premiers cas (et pour les anciens analyseurs JSON), vous devez encoder U + 2028 et U + 2029 car ce sont des caractères de nouvelle ligne en JavaScript même s'ils sont autorisés dans les chaînes non codées en JSON.
Pour être correct, vous devez échapper
\
et citer des caractères JSON et ce n'est jamais une mauvaise idée de toujours encoder NUL.Si le code HTML peut être diffusé sans encodage de contenu, vous devez encoder
+
pour éviter les attaques UTF-7 .Dans tous les cas, la table d'échappement suivante fonctionnera:
\u0000
\n
ou\u000a
\r
ou\u000d
"
->\u0022
&
->\u0026
'
->\u0027
+
->\u002b
/
->\/
ou\u002f
<
->\u003c
>
->\u003e
\
->\\
ou\u005c
\u2028
\u2029
Ainsi, la valeur de chaîne JSON pour le texte
Hello, <World>!
avec une nouvelle ligne à la fin serait"Hello, \u003cWorld\u003e!\r\n"
.la source
return (input.replace(/([\s"'
& + \ / \\ <> \ u2028 \ u2029 \ u0000]) / g, (match, p1) => {return\\u${p1.codePointAt(0).toString(16).padStart(4, 0)}
; })); `Une autre façon de le faire est de mettre les données json dans la
<script>
balise, mais pas avectype="text/javascript"
, mais avectype="text/bootstrap"
outype="text/json"
type, pour éviter l'exécution de javascript.Ensuite, à un endroit de votre programme, vous pouvez le demander de cette manière:
Côté serveur, vous pouvez faire quelque chose comme ça (cet exemple avec php et twig ):
la source
<script type="application/json" id="MyData"></script>
fonctionne parfaitement. Puis, en utilisant ActiveWAFL / DblEj, je peux le regarder avec:document.GetData("#MyData")
.<script type="application/json" id="MyData"> "abc</script><script>alert()</script>" </script>
Une autre option consiste à encoder en base64 la chaîne JSON et si vous devez l'utiliser dans votre javascript, décodez-la avec la
atob()
fonction.la source
atob
. Je n'ai jamais été au courant de cela!Vous pouvez utiliser knockoutjs,
knockout.js
Production
Prénom: Jayson Nom: Monterroso
Vérifiez ceci: http://learn.knockoutjs.com/
la source
Rien d'extraordinaire ici. Depuis PHP, exécutez la chaîne JSON
htmlspecialchars
pour vous assurer qu'aucun caractère spécial ne peut être interprété comme HTML. De Javascript, pas d'échappatoire nécessaire; il suffit de définir l'attribut et vous êtes prêt à partir.la source
Pour les objets JSON simples, le code ci-dessous fonctionnerait.
Encoder:
Décoder:
la source
Ce que vous pouvez faire, c'est utiliser cdata autour de vos éléments comme ceci
où mydata est une chaîne json brute. J'espère que cela vous aidera, vous et les autres.
la source
">
dans mydata?Une autre pensée qui pourrait être utilisée est de stocker les données JSON sous forme de chaîne base64 dans l'attribut, puis de les utiliser
window.atob
ouwindow.btoa
de les restaurer dans des données JSON utilisables.la source