在Django中使用POSTed json对象

时间:2012-12-02 09:18:23

标签: javascript jquery python django json

我试图弄清楚如何处理Django中的POSTed json对象。我正在将一个json对象发布到服务器,并希望像python字典一样使用它。

这是我的js:

$.post(
        "/projects/vote/", 
        obj,
        function(data) {
            //alert("Data Loaded: " + data);
            alert(data["msg"]);
});

我要返回的内容(django视图结束):

return HttpResponse(json.dumps(foo), mimetype="application/json")

其中

foo = {"msg": str(postdata)}

换句话说,我正在将一个json对象发布到服务器,并警告我在服务器上获得的python对象的字符串,以便我可以看到发生了什么。

如果我的obj是:

var obj = {
    'bulk': false,
    'data': {
          'chosen': '14',
          'proj1': '15',
          'proj2': '14',
          'proj3': '16',
          'more': false,


        },
    'data2': [
           {
               'a': 'apple'
           },
           {
               'b': 'banana'
           },
        ],      
  }

我得到了回报:

<QueryDict: {u'data[proj3]': [u'16'], u'data[proj2]': [u'14'], u'data[chosen]': [u'14'], u'data[proj1]': [u'15'], u'bulk': [u'false'], u'data2[0][a]': [u'apple'], u'data[more]': [u'false'], u'data2[1][b]': [u'banana']}>

为什么json obj和python dict的结构不对齐?我如何让结构相同?例如而不是data2 [0] [a],我会得到data2作为另一个字典的关键

我如何获得postdata:

# django version 1.4
postdata = request.POST.copy()

4 个答案:

答案 0 :(得分:2)

您可以使用JSON.stringify将json发布为纯字符串,如下所示:

    $.post(
            "/projects/vote/", 
            {msg: JSON.stringify(obj)},
            function(data) {
                //alert("Data Loaded: " + data);
                alert(data);
    });

因此,在服务器端,您只需从'msg'中提取request.POST

    def view(request):
          return HttpResponse(request.POST['msg'], mimetype="application/json")

请注意,某些浏览器默认不支持JSON.stringify,您可能需要使用json lib:https://github.com/douglascrockford/JSON-js

答案 1 :(得分:1)

您没有显示您从POST获得postdata的方式,但您应该在1.4之前的版本中使用request.bodyrequest.raw_post_data)。

答案 2 :(得分:0)

您没有发布JSON数据。将dataType参数设置为json

$.post(
        "/projects/vote/", 
        obj,
        function(data) {
            //alert("Data Loaded: " + data);
            alert(data["msg"]);
        },
        'json'
);

答案 3 :(得分:0)

服务器可以简单地返回一个字符串,js可以这样写:

$.post(
    "/projects/vote/", 
    obj,
    function(data) {
        data=eval('(' + data+ ')');//get the json object from string.
        //alert("Data Loaded: " + data);
        alert(data["msg"]);
});

希望这有用。