如何从simplejson.dumps中反序列化HTML片段?
我正在做一个Django项目,其中一个前端同事希望我在处理一个ajax请求时,返回一个JSON字典,其中一个键的值是从模板渲染出来的HTML内容。比如说:
d = {
"hits": 22,
"page": 3,
"somehhtml": """<div id='item1'>Something</div><div id='item2'>More Stuff</div>
<p>More after some linebreaks.</p>"""
}
当我使用simplejson.dumps来返回这个内容时,它会对HTML进行转义,可能是为了让它符合JSON格式,这样就会出现很多\n换行符和被转义的引号。
为了应急,我通过在字典中添加一个字符串模板替换字符,然后在用dumps()序列化之前把它替换成渲染后的模板,来让它工作。这显然是个糟糕的做法,肯定不是正确的解决方案。
那么,处理这个问题的正确方法是使用一些jQuery或JavaScript的方式在客户端进行反序列化,还是我需要在Python端写一个自己的序列化器,以避免转义某些内容?我尝试在JavaScript中用eval()来处理,但这给我带来了语法错误。
我现在的做法(即不转义字符)有什么实际原因是个坏主意吗?(我问这个是为了更好地解释,而不是因为我认为我不应该改变它)。
谢谢!
Ludo。
1 个回答
1
我不明白为什么你需要对你的 JSON 字符串进行反转义,明明它应该是被转义的,才能成为有效的 JavaScript 和 Python 字符串呢?
顺便说一下,换行符 \n
和 JSON 转储没有关系,这只是因为键 "somehhtml" 的值是一个包含换行的多行字符串(我觉得这可能是个错误,也许你想用 <br />
)。
总结一下,我们来看看一些代码吧 :) :
python
>>> import json
>>> json.dumps(d)
'{"hits": 22, "page": 3, "somehhtml": "<div id=\'item1\'>Something</div><div id=\'item2\'>More Stuff</div>\\n\\n<p>More after some linebreaks.</p>"}'
javascript
>>> s = '{"hits": 22, "page": 3, "somehhtml": "<div id=\'item1\'>Something</div><div id=\'item2\'>More Stuff</div>\\n\\n<p>More after some linebreaks.</p>"}'
>>> JSON.parse(s)
Object { hits=22, page=3, somehhtml="<div id='item1'>Somethi...er some linebreaks.</p>"}
// eval is not safe, but you should add a parentheses as a workaround
>>> eval('(' + s + ')')
Object { hits=22, page=3, somehhtml="<div id='item1'>Somethi...er some linebreaks.</p>"}