0

我想弄清楚如何在 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 作为另一个字典的键而不是 data2[0][a]

我如何获取邮政数据:

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

4 回答 4

2

您可以使用以下方式将 json 作为纯字符串发布JSON.stringify

    $.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

于 2012-12-02T14:22:22.380 回答
1

你没有展示你是如何postdata从 POST 中获得的,但你应该使用request.bodyrequest.raw_post_data在 1.4 之前的版本中)。

于 2012-12-02T11:16:45.007 回答
0

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

$.post(
        "/projects/vote/", 
        obj,
        function(data) {
            //alert("Data Loaded: " + data);
            alert(data["msg"]);
        },
        'json'
);
于 2012-12-02T09:31:06.590 回答
0

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

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

希望这有帮助。

于 2012-12-03T07:26:34.917 回答