我正在开发一个Django项目,其中一个前端人员已经问过,对于我们的一个ajax请求,他希望我返回一个JSON dict,其中一个键是一些呈现的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()序列化之前向dict添加字符串模板替换字符,然后将其替换为渲染模板,然后再将其发送回浏览器。显然,这很可怕,肯定不是正确的做法。
所以,正确的方法是在客户端使用一些jQuery / JS反序列化方法来处理这个问题,还是我需要在Python端编写自己的序列化程序以逃避某些事情?我尝试将它传递给JS中的eval(),但这给了我一个SyntaxError。
是否有实际的理由为什么我现在正在做的事情(即,不逃避字符)是一个坏主意? (为了帮助我解释,不是因为我认为我不应该改变它。)
谢谢!
鲁
答案 0 :(得分:1)
我不明白你为什么需要unescape你的json字符串,而它应该被转义为有效的javascript和python字符串?
顺便说一句,新行\n
与json dumper无关,只是因为键“somehhtml”的值是一个包含新行的多行字符串(我认为这是一个错误也许你想放<br />
)。
总结让我们放一些代码:):
<强>蟒强>
>>> 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>"}