Лучший способ сохранить JSON в атрибуте HTML?
мне нужно отправить JSON-объект в качестве атрибута в HTML-элемент.
-
HTML не нужно проверять.ответил Квентин: храните JSON в
data-*
атрибут, что является допустимым HTML5. -
объект JSON может быть любого размера-т. е. огромный
ответил майку Мори:предел для an HTML атрибут потенциально 65536 символов.
-
что делать, если JSON содержит специальные символы? например,
{foo: '<"bar/>'}
ответил Квентин: закодировать в JSON-строку, прежде чем положить его в атрибут, так как в соответствии с обычными соглашениями. для PHP, используйте
htmlentities()
7 ответов:
HTML не нужно проверять.
почему бы и нет? Проверка действительно легко QA, который ловит много ошибок. Используйте HTML 5 .
объект JSON может быть любого размера (т. е. огромный).
Я не видел никакой документации по ограничениям браузера на размеры атрибутов.
если вы столкнетесь с ними, то хранить данные в
<script>
. Определите объект и элемент картыid
s к именам свойств в этот объект.что делать, если JSON содержит специальные символы? (например, {test: ''})
просто следуйте обычным правилам для включения ненадежных данных в значения атрибутов. Используйте
&
и"
(если вы заключаете значение атрибута в двойные кавычки) или'
(если вы заключаете значение атрибута в одинарные кавычки).обратите внимание, однако, что это не JSON (который требует, чтобы имена свойств были строками и строки были разделяется только двойными кавычками).
в зависимости от того, куда вы его положили,
- на
<div>
Как вы просили, вам нужно убедиться, что JSON не содержит специальных HTML, которые могут запускать тег, HTML-комментарий, встроенный doctype и т. д. Вам нужно бежать по крайней мере<
и&
таким образом, чтобы исходный символ не появлялся в экранированной последовательности.- In
<script>
элементы вам нужно убедиться, что JSON не содержит конечный тег</script>
или экранирование границы текста:<!--
или-->
.- в обработчиках событий вам нужно убедиться, что JSON сохраняет свое значение, даже если у него есть вещи, которые выглядят как HTML-объекты и не нарушают границы атрибутов (
"
или'
).для первых двух случаев (и для старых парсеров JSON) вы должны кодировать U+2028 и U+2029, поскольку это символы новой строки в JavaScript, даже если они разрешены в строках, не закодированных в JSON.
для корректности, нужно побег
\
и символы цитаты JSON, и это никогда не плохая идея всегда кодировать NUL.если HTML может быть подан без кодировки контента, вы должны кодировать
+
предупреждения UTF-7 атак.в любом случае, следующая экранирующая таблица будет работать:
- NUL ->
\u0000
- CR ->
\n
или\u000a
- LF ->
\r
или\u000d
"
->\u0022
&
->\u0026
'
->\u0027
+
->\u002b
/
->\/
или\u002f
<
->\u003c
>
->\u003e
\
->\
или\u005c
- U+2028 ->
\u2028
- U+2029 ->
\u2029
Итак, строковое значение JSON для текста
Hello, <World>!
С новой строкой в конце будет"Hello, \u003cWorld\u003e!\r\n"
.
другой способ, которым вы можете это сделать-это поместить данные json внутрь
<script>
тег, но не сtype="text/javascript"
, но сtype="text/bootstrap"
илиtype="text/json"
введите, чтобы избежать выполнения javascript.потом, в каком-то месте вашей программы, вы можете задать его таким образом:
function getData(key) { try { return JSON.parse($('script[type="text/json"]#' + key).text()); } catch (err) { // if we have not valid json or dont have it return null; } }
на стороне сервера, вы можете сделать что-то вроде этого (этот пример с php и веточка):
<script id="my_model" type="text/json"> {{ my_model|json_encode()|raw }} </script>
Вы можете использовать knockoutjs,
<p>First name: <strong data-bind="text: firstName" >todo</strong></p> <p>Last name: <strong data-bind="text: lastName">todo</strong></p>
нокаут.js
// This is a simple *viewmodel* - JavaScript that defines the data and behavior of your UI function AppViewModel() { this.firstName = "Jayson"; this.lastName = "Monterroso"; } // Activates knockout.js ko.applyBindings(new AppViewModel());
выход
имя: Джейсон Фамилия: Monterroso
проверить это: http://learn.knockoutjs.com/
другой вариант-base64 кодировать строку JSON, и если вам нужно использовать ее в своем javascript, декодируйте ее с помощью