【问题标题】:How do I deserialise (deserialize) HTML fragments in JSON from simplejson.dumps?如何从 simplejson.dumps 中反序列化(反序列化)JSON 中的 HTML 片段?
【发布时间】:2011-08-19 11:43:57
【问题描述】:

我正在做一个 Django 项目,其中一位前端人员询问,对于我们的一个 ajax 请求,他希望我返回一个 JSON 字典,其中一个键是来自模板。所以,例如:

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 换行符,并且引号字符被转义了。

作为 hack,我通过在使用 dumps() 将其序列化之前将字符串模板替换字符添加到 dict 中,然后在将其发送回浏览器之前将其替换为呈现的模板来使其工作。显然,这很可怕,而且肯定不是正确的做法。

那么,处理这个问题的正确方法是在客户端使用一些 jQuery/JS 反序列化方式,还是我需要在 Python 端编写自己的序列化器来避免某些事情?我尝试将它传递给 JS 中的 eval(),但这给了我一个 SyntaxError。

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

谢谢!

卢多。

【问题讨论】:

    标签: jquery python ajax django json


    【解决方案1】:

    我不明白您为什么需要对 json 字符串进行转义,而应该将其转义为有效的 javascript 和 python 字符串?

    顺便说一句,换行符\n 与 json dumper 无关,因为键“somehhtml”的值是一个包含换行符的多行字符串(我认为这是一个错误,也许你想放&lt;br /&gt;)。

    为了总结,让我们放一些代码:):

    蟒蛇

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

    【讨论】:

    • 不,换行符是正确的,因为该值来自渲染的 Django 模板。 JSON.parse() 正是我想要的 - 谢谢:)
    • @Ludo:好吧,这是有道理的,非常欢迎你,顺便说一下,如果你使用 jquery,你应该检查一下:api.jquery.com/jQuery.parseJSON
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多