【问题标题】:simplejson double escapes data causing invalid JSON stringsimplejson 双重转义导致无效 JSON 字符串的数据
【发布时间】:2012-01-01 17:12:47
【问题描述】:

我有一个简单的表格来管理我店里的制造商。发布表单后,ajax 调用将带有更新数据的 json 返回到表单。问题是,返回的字符串无效。看起来它是双重转义的。奇怪的是,整个商店都采用了类似的方法,没有任何问题。我也在使用 jquery 1.6 作为 javascript 框架。

模型包含 3 个字段:用于名称的字符、用于描述的文本和用于制造商徽标的图像字段。

功能:

def update_data(request, manufacturer_id):
    """Updates data of manufacturer with given manufacturer id.
    """
    manufacturer = Manufacturer.objects.get(pk=manufacturer_id)
    form = ManufacturerDataForm(request.FILES, request.POST, instance=manufacturer)

    if form.is_valid():
        form.save()

    msg = _(u"Manufacturer data has been saved.")

    html = [
        ["#data", manufacturer_data_inline(request, manufacturer_id, form)],
        ["#selectable-factories-inline", selectable_manufacturers_inline(request, manufacturer_id)],
    ]

    result = simplejson.dumps({
        "html": html
    }, cls=LazyEncoder)
    return HttpResponse(result)

控制台中的错误:无效 JSON 错误:

uncaught exception: Invalid JSON: {"html": [["#data", "\n<h2>Dane</h2>\n<div class="\"manufacturer-image\"">\n \n</div>\n<form action="\"/manage/update-manufacturer-data/1\"" method="\"post\"">\n \n <div class="\"field\"">\n <div class="\"label\"">\n <label for="\"id_name\"">Nazwa</label>:\n </div>\n \n \n <div class="\"error\"">\n <input id="\"id_name\"" name="\"name\"" maxlength="\"50\"" type="\"text\"">\n <ul class="\"errorlist\""><li>Pole wymagane</li></ul>\n </div>\n \n </div>\n\n <div class="\"field\"">\n <div class="\"label\"">\n <label for="\"id_image\"">Zdjecie</label>:\n </div>\n \n \n <div>\n <input name="\"image\"" id="\"id_image\"" type="\"file\"">\n </div>\n \n </div>\n\n <div class="\"field\"">\n <div class="\"label\"">\n <label for="\"id_description\"">Opis</label>:\n </div>\n \n \n <div>\n <textarea id="\"id_description\"" rows="\"10\"" cols="\"40\"" name="\"description\""></textarea>\n </div>\n \n </div>\n \n <div class="\"buttons\"">\n <input class="\"ajax-save-button" button\"="" type="\"submit\"">\n </div>\n</form>"], ["#selectable-factories-inline", "\n <div>\n <a class="\"selectable" selected\"\n="" href="%5C%22/manage/manufacturer/1%5C%22">\n L1\n </a>\n </div>\n\n <div>\n <a class="\"selectable" \"\n="" href="%5C%22/manage/manufacturer/4%5C%22">\n KR3W\n </a>\n </div>\n\n <div>\n <a class="\"selectable" \"\n="" href="%5C%22/manage/manufacturer/3%5C%22">\n L1TA\n </a>\n </div>\n\n"]]}

有什么想法吗?

【问题讨论】:

  • 我已经记录了结果变量,所以基本上只是返回到模板的东西,它被正确地转义了。所以看起来响应在被 jquery 的 parseJSON 函数处理之前被转义了。现在我真的很困惑。
  • 错误在哪里被捕获?是在服务器端,还是在浏览器中?

标签: jquery python django simplejson django-lfs


【解决方案1】:

在您的 json 文本区域中同时存在双引号及其 html 编码。例如,您的所有类属性在错误输出中都是这样的:

class="\&quote;classname\&quote;"

以上内容应为:

class=\"classname\"

一个原始的json.dumps 会输出这个:

>>> json.dumps(["#data", '<div class="classname"></div>'])
'["#data", "<div class=\\"classname\\"></div>"]'

我怀疑您的 manufacturer_data_inlineselectable_manufacturers_inline 调用将您的引号加倍 "\&amp;quote; 或 LazyEncoder 类做错了什么。

【讨论】:

    猜你喜欢
    • 2015-06-30
    • 2022-01-26
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2011-04-25
    • 2019-05-13
    • 2023-03-22
    相关资源
    最近更新 更多