12

如何通过来自 JS 和服务器端的 AJAX 调用传递复合 JSON 结构,将其读取为 python 中“非常相似”的数据结构?

我知道可以使用 json 格式(simplejson 等),但我觉得 QueryDict 本身在我的情况下格式错误或重新格式化?

例子:

当通过 AJAX 将 JSON 对象数组 [{"id": 1},{"id": 2},{"id": 3}] 传递给 Django 视图时,QueryDict 被格式化为:

POST:<QueryDict: {u'json_data[0][id]': [u'1'], u'type': [u'clone'], 
u'csrfmiddlewaretoken': [u'69bb3c434ced31ab301ede04bf491ec0'], 
u'json_data[1][id]': [u'2'], u'json_data[2][id]': [u'3']}>

我什至如何遍历 json_data?

我想得到这样的东西:

POST:<QueryDict: {u'json_data': [{u'id': [u'1']}, {u'id': [u'2']}, {u'id': [u'3']}]},
u'csrfmiddlewaretoken': [u'69bb3c434ced31ab301ede04bf491ec0'], u'type': [u'clone']>

这样我就可以将 QueryDict 作为字典访问并将 json_data 作为列表检索并按特定顺序处理它:也许只是按顺序列表顺序遍历它们。就像是:

ret = request.POST
for item in ret['json_data']:
    process(item['id'])

事实上,进入 process() 的值可能是另一个键值对字典,而不仅仅是一个数字(1、2、3 等)

Javascript:

var test = [{"id": 1},{"id": 2},{"id": 3}];
$.post(
    "/insert_tc",
    {
      json_data: test,
      "type": 'clone',
      "csrfmiddlewaretoken": $csrf_token
    },  
    function(json) {
        //CALLBACK
    },
    "json"
);  

视图.py:

def insert_tc(request):
    if request.method == 'POST':       
    ret = request.POST
    type = ret['type']
    list = ret.getlist(ret)

但列表返回空 []

我尝试了 simplejson 转储、加载、项目、获取方法,但它们都没有帮助。

我什至尝试过 jQuery.param(obj, true),但这不是我想要的(虽然有点接近)。

有没有不同/更好的方法通过 AJAX 来回传递复合数据结构 Django <-> JS?

4

2 回答 2

14

您应该使用 JSON.stringify() 对 JSON 进行字符串化。这会将 JSON 对象转换为字符串格式,以便在另一端正确解析。另一方面,您将需要使用 json.loads() 来“取消字符串化”对象。

javascript

var test = [{"id": 1},{"id": 2},{"id": 3}];
$.post(
    "/insert_tc",
    {
      json_data: JSON.stringify(test),
      "type": 'clone',
      "csrfmiddlewaretoken": $csrf_token
    },  
    function(json) {
        //CALLBACK
    },
    "json"
);  

查看

import json
def insert_tc(request):
    if request.method == 'POST':       
        ret = request.POST
        type = ret['type']
        list = json.loads(ret['json_data'])
于 2014-05-07T04:33:55.770 回答
7

这实际上是 jQuery,而不是 Django,很奇怪。您的test变量不包含 JSON,而是实际的 JS 对象。jQuery,出于自己最熟悉的原因,在发布之前将其解析为一些非常奇怪的格式,因此您得到了结果。如果你这样做了(注意整个事情的引号):

var test = '[{"id": 1},{"id": 2},{"id": 3}]';

你会发现你得到的 QueryDict 非常接近你所期望的:你唯一需要做的就是调用json.loads(ret['json_data']).

还有一些我无法理解的原因。jQuery 不包含将对象数组转换为 JSON 的任何功能。您需要为此找到一个插件或单独的库。

于 2012-04-05T22:08:35.493 回答