5

注意:这个问题非常接近Embedding JSON objects in script tags,但对该问题的回答提供了我已经知道的内容(在 JSON /==中\/)。我想知道如何进行转义。

<script>HTML 规范禁止在元素中的任何位置使用封闭的 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'<\/')

有没有更好的办法?或者我忽略的任何问题?

4

1 回答 1

6

更新的答案

好吧,我错误地假设了一些事情。为了转义 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 已编码的副作用。如果可能的话,可以通过不使用 DJango 来生成 JSON 而使用 simplejson 来避免这种情况:

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>

它的目的是在这类事情上标记解析器。否则,您将需要使用已经提到的字符转义。

于 2013-03-08T15:12:00.883 回答