如何从simplejson.dumps中反序列化HTML片段?

0 投票
1 回答
1823 浏览
提问于 2025-04-16 23:56

我正在做一个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>"}

撰写回答