从Javascript发送JSON列表到Django后端并正确解析

1 投票
1 回答
1411 浏览
提问于 2025-04-18 00:28

我正在尝试向Django发送一个POST请求,但我无法获取到一个可读的json列表。我可以让后端获取列表中的项目(json对象),但是这些对象似乎看起来很难理解。

有人能帮我检查一下我的操作步骤和这个讨论帖最后的结果吗?我现在快没办法了 =/

步骤1: 创建JSON列表:

google_news_articles = []

步骤2: 填充JSON列表:

for (each_checkbox in self.coverage_report_google_news_table.checked_rows){
    var each_article    = $(self.coverage_report_google_news_table.checked_rows[each_checkbox]).parents('tr');

    google_news_articles.push({
        date:           each_article.find('.date').text(),
        outlet_domain:  strip(each_article.find('.outlet_domain').text()),
        title:          each_article.find('.title').text(),
        link:           each_article.find('.title').attr('href')
    });
}

步骤3: 发起POST请求:

$.post('/google_news_unsafe_add/',{
    'google_news_articles[]':   google_news_articles,
    'csrfmiddlewaretoken':      $('[name="csrfmiddlewaretoken"]').val()
},function(result){
    if(result.result=='ok'){
        $('#save-status').html("Saved");
    }else{
        $('#save-status').html("An Error Occurred");
    }
});

步骤4: 从后端处理:

def google_news_unsafe_add_view(request):
    print '!!!'
    print request.POST
    print '!!!'
    print '\\\\\\'
    print request.POST.getlist('google_news_articles[]')
    print '\\\\\\'
    return 

结果: 终端打印:

!!!
<QueryDict: {u'csrfmiddlewaretoken': [u'nm5NAJyHEvoiFOThSrffU1pETcrQ7oa2'], u'google_news_articles[]': [u'[object Object]', u'[object Object]']}>
!!!
\\\
[u'[object Object]', u'[object Object]']
\\\

我得到的只是这个[u'[object Object]', u'[object Object]']列表,当我尝试解析这个列表时,我得到:

    json.loads(request.POST.getlist('google_news_articles[]'))
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer

而当我尝试解析这些对象时,我得到:

    print json.loads(each_json)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 338, in loads
    return _default_decoder.decode(s)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 365, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py", line 383, in raw_decode
    raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded

有没有什么提示?

1 个回答

1

感谢Two-Bit Alchemist的评论,我意识到我不应该发送一个纯粹的JSON对象,而是应该发送一个序列化的JSON对象。

所以我把这个:

google_news_articles.push({
    date:           each_article.find('.date').text(),
    outlet_domain:  strip(each_article.find('.outlet_domain').text()),
    title:          each_article.find('.title').text(),
    link:           each_article.find('.title').attr('href')
});

换成了这个:

google_news_articles.push(JSON.stringify({
    date:           each_article.find('.date').text(),
    outlet_domain:  strip(each_article.find('.outlet_domain').text()),
    title:          each_article.find('.title').text(),
    link:           each_article.find('.title').attr('href')
}));

现在一切都顺利了 =)

撰写回答