在Django中反序列化JSON

9

这个问题令我十分苦恼。我已经花了几个小时在Django中尝试反序列化JSON。

我有一个函数:

    # in index.html
    function updateWidgetData(){  
        var items=[]; 
        for statement here:
            for statement here:
                var item={  
                    id: $j(this).attr('id'),  
                    collapsed: collapsed,  
                    order : i,  
                    column: columnId  
                };  
        items.push(item);  

        var sortorder={ items: items};  

        $j.post('2', 'data='+$j.toJSON(sortorder), function(response)
        {  
            if(response=="success")  
                $j("#console").html('<div class="success">Saved</div>').hide().fadeIn(1000);  
            setTimeout(function(){  
                $j('#console').fadeOut(1000);  
        }, 2000);  
    });

}

我正在尝试在Django中反序列化JSON:

# in views.py
if request.is_ajax():
    for item in serializers.deserialize("json", request.content):
        item = MyObject(id=id, collapsed=collapsed, order=order, column=column)
    return HttpResponse("success")
else:
    ....

它一直没有起作用。我知道这可能是一个非常琐碎的问题,但我以前从未使用过JSON,我真的很感激帮助。谢谢!


2
“而且它一直没有工作”-- 它在哪里不工作?在Django视图中出现了错误吗?提供堆栈跟踪/错误消息将有助于我们帮助您。 - Steve Jalim
JS在成功后显示一个名为console的div,闪现消息“已保存”。它一直没有出现,让我认为Django由于某些错误没有发送HttpResponse。我认为没有django错误页面弹出,因为它是ajax,不会带来另一个模板。 - Temuz
你可以使用Firebug或Google Chrome开发者工具来查看返回的页面(错误页面)。 - Marc Demierre
+1 的标题,易于找到。 - Pierre de LESPINAY
2个回答

19

serializers.deserialize 用于反序列化一种特定类型的 JSON,即使用 serializers.serialize 序列化模型实例后生成的数据。对于您的数据,您只需要使用标准的 simplejson 模块。

而且第二个问题是,您的响应不仅仅是 JSON - 它是一个带有 JSON 的 HTTP POST,位于 data 字段中。因此:

from django.utils import simplejson
data = simplejson.loads(request.POST['data'])

错误将作为普通的Django错误页面返回。使用Firebug查看它。 - Daniel Roseman
当然,它应该是request.POST['data'](如上所述更改)。 - Daniel Roseman
哦,糟糕!没听清楚。非常感谢,我很感激! - Temuz
5
иҮӘDjango 1.5зүҲжң¬иө·пјҢдҪ еә”иҜҘдҪҝз”ЁPythonзҡ„jsonжЁЎеқ—пјҢиҖҢдёҚжҳҜзі»з»ҹдҫқиө–зҡ„simplejsonжЁЎеқ—гҖӮ - Pierre de LESPINAY
Django将以'application/json'发送的POST数据暴露在字段request.body中 - 我不确定这是最近的更改还是由于编码的原因。 - Nicko

5
from django.core import serializers

obj_generator = serializers.json.Deserializer(request.POST['data'])

for obj in obj_generator:                          
    obj.save()

对象现在应该已经保存并在Django管理界面中可见


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接