如何从simplejson.dumps中对JSON中的HTML片段进行反序列化(反序列化)?

时间:2011-08-19 11:43:57

标签: jquery python ajax django json

我正在开发一个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。

是否有实际的理由为什么我现在正在做的事情(即,不逃避字符)是一个坏主意? (为了帮助我解释,不是因为我认为我不应该改变它。)

谢谢!

1 个答案:

答案 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>"}