在json输出中转义正斜杠

时间:2013-08-21 14:50:18

标签: python json

我有一个python服务器端应用程序,它生成一个简单的HTML页面,其中包含大量客户端javascript,根据分配给js的大量JSON数据生成客户端显示给用户的DOM树变量。其中一些JSON数据包含字符串,其中一些包含HTML标记。这一切都归结为这样的事情:

<html>
...
var tmp = "<p>some text</p>";
...
</html>

不出所料,上面的内容不起作用,因为它应该如下所示,以使浏览器HTML解析器满意:

<html>
...
var tmp = "<p>some text<\/p>";
...
</html>

(注意逃脱的正斜杠)

使用python默认的json库生成插入HTML中的JSON。也就是说,json.dumps是明确设计为而不是转义为字符串中的正斜杠。

我试图将json.JSONDecoder子类化为覆盖python字符串的行为,但这不起作用,因为它不允许特化基本python类型的序列化。

我试图使用各种其他python json库而没有太多运气:似乎因为大多数人讨厌转义的正斜杠,大多数库都不会生成它们。

在调用json.dumps之前,我可以在将它们填入python数据结构之前手动转义字符串。我还可以编写一个函数来递归迭代数据结构,发现字符串,并自动转义它们(从长远来看更好)。我可以在将它填入HTML之前将json.dumps生成的字符串转义(我不确定这是否会导致在HTML中插入无效的JSON)。

这引出了我的问题:是否有一个json序列化库可以被强制转义为在python中转义字符串中的正斜杠?

1 个答案:

答案 0 :(得分:2)

我发现的最好方法就是对结果字符串进行替换。

out = json.dumps(obj)
out = out.replace("/", "\\/")

在JSON规范中,转义正斜杠是可选的,这样做可确保您不会在字符串中获得"</script>"次攻击。