如何在使用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。如果代码无效,您可能需要通过pipeasy_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避免在这种事情上标记解析器。否则,你需要使用已经提到的字符转义。

+0

但是,这只适用于XHTML,对不对?用'''',''CDATA''似乎不起作用。这就是为什么我更喜欢JSON中的''\ /''转义。问题更多的是关于如何进行字符串替换,而不是如何逃避文本本身。 – 2013-03-08 16:13:54

+0

@GeoffreyHing啊是的我错误地认为XHTML的一部分。我已经为DJango转义部分更新了我的答案。 – cwgem 2013-03-08 16:57:32

+1

@GeoffreyHing:django带有它自己的simplejson副本,您可以使用'from django.utils import simplejson'导入,因此您无需单独安装它。 – 2013-03-08 18:06:12