如何在使用Python的JSON中的HTML标记中关闭'/'?
问题描述:
注意:这个问题非常接近Embedding JSON objects in script tags,但对这个问题的回答提供了我已经知道的东西(在JSON /
== \/
中)。我想知道如何逃避。如何在使用Python的JSON中的HTML标记中关闭'/'?
HTML规范禁止在<script>
元素中的任何位置关闭HTML标记。因此,这将导致解析错误:
<script>
var assets = [{
"asset_created": null,
"asset_id": "575155948f7d4c4ebccb02d4e8f84d2f",
"body": "<script></script>"
}];
</script>
就我而言,我生成通过渲染Django模板内的JSON字符串无效的情况下,即:
<script>
var assets = {{ json_string }};
</script>
我知道,JSON解析\/
与/
相同,所以如果我可以在JSON字符串中跳过我的关闭HTML标记,那我会很好。但是,我不确定最好的方式来做到这一点。
我幼稚的做法只会是这样的:
json_string = '[{"asset_created": null, "asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", "body": "<script></script>"}]'
escaped_json_string = json_string.replace('</', r'<\/')
有没有更好的办法?或者我忽略的任何陷阱?
答
更新回答
好吧,我认为一些事情不正确。为了转义JSON,simplejson库的可用方法为JSONEncoderForHTML。如果代码无效,您可能需要通过pip
或easy_install
进行安装。然后,你可以做这样的事情:
import simplejson
asset_json=simplejson.loads(json_string)
encoded=simplejson.encoder.JSONEncoderForHTML().encode(assets_json)
这encoded
会给你:
'{"asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", "body": "\\u003cscript\\u003e\\u003c/script\\u003e", "asset_created": null}'
这比斜线更全面的解决方案取代,因为它处理其他编码警告也是如此。
loads
部分是使JSON已编码的副作用。
simplejson.dumps(your_object_to_encode, cls=simplejson.encoder.JSONEncoderForHTML)
老回答
尝试在CDATA包装脚本:
<script>
//<![CDATA[
var assets = [{
"asset_created": null,
"asset_id": "575155948f7d4c4ebccb02d4e8f84d2f",
"body": "<script></script>"
}];
//]]>
</script>
它的意思这可以通过,如果可以不使用Django生成JSON,而是使用simplejson避免在这种事情上标记解析器。否则,你需要使用已经提到的字符转义。
但是,这只适用于XHTML,对不对?用'''',''CDATA''似乎不起作用。这就是为什么我更喜欢JSON中的''\ /''转义。问题更多的是关于如何进行字符串替换,而不是如何逃避文本本身。 – 2013-03-08 16:13:54
@GeoffreyHing啊是的我错误地认为XHTML的一部分。我已经为DJango转义部分更新了我的答案。 – cwgem 2013-03-08 16:57:32
@GeoffreyHing:django带有它自己的simplejson副本,您可以使用'from django.utils import simplejson'导入,因此您无需单独安装它。 – 2013-03-08 18:06:12