用 html 数据属性中的字符串编码 JSON

Posted

技术标签:

【中文标题】用 html 数据属性中的字符串编码 JSON【英文标题】:Encoding JSON with strings in html data attributes 【发布时间】:2016-03-16 21:13:10 【问题描述】:

我需要将一些数据传递给 javascript。所以我创建了一个template tag:

from django.utils.safestring import mark_safe
from django import template
import json

register = template.Library()

@register.simple_tag
def mydata():
    return mark_safe(json.dumps([("a", 1), ("b", 2)])

然后在我的模板中,

<div id="mydata" data-stuff="% mydata %" style="display:none;"></div>

在加载了jquery的js文件中使用:

$('#mydata').data('stuff') //automatically does JSON.parse

问题是来自"a""b" 的引号破坏了html 属性语法。我可以简单地更改为单引号 (data-stuff='% mydata %'),但是否有更明确的 django 方法将 JSON 注入模板?可能类似于 escape_my_jsonescape_for_html_attribute 函数。

【问题讨论】:

【参考方案1】:

尽管在属性中存储 json 有点麻烦,但单引号(撇号,U+0027)在JSON 中不是有效的字符串分隔符。一些浏览器可能有这个问题,虽然我不能指出任何问题。

如果 JSON 结构不复杂,则将每个字段存储为单独的数据-*,否则在 JS 中。

如果您需要使用属性...真的,真的...我不会替换引号(简单替换会很松散)更有可能使用 base64 对其进行编码。

关于转义的注意事项:要转义双引号(也可以是单引号),您可以使用过滤器 addslashes(或在 python 中 django.template.defaultfilters.addslashes),但它不支持 json 数据,因此它可能会中断。

【讨论】:

好的,所以你推荐&lt;script&gt;var mydata = JSON.parse('% mydata %');&lt;/script&gt;?我很惊讶 jquery 明确地尝试将 data- 属性解析为 JSON,如果它被认为如此 hacky。另外我的意思是对属性使用单引号,而不是在 JSON 中。 即使没有 JSON.parse,因为 JSON 对象是有效的 JS 对象var mydata = % mydata %;

以上是关于用 html 数据属性中的字符串编码 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Python学习笔记-内置函数

python3 中的Json序列化反序列化 和 字符编码的问题解决

用 html/jquery 中的一个 JSON 字符串替换许多数据标签 [重复]

JSON 格式

JavaScript高级 对象 函数 回调函数 IIFE

JSON 字符串数据大小平台无关