2012-04-05 76 views
11

Làm cách nào để chuyển cấu trúc JSON hỗn hợp qua cuộc gọi AJAX từ JS và phía máy chủ, đọc nó như một cấu trúc dữ liệu "rất giống" trong python?Django: Đọc mảng các đối tượng JSON từ QueryDict

Tôi hiểu rằng định dạng json có thể được sử dụng (simplejson, v.v.), nhưng bằng cách nào đó tôi cảm thấy rằng bản thân QueryDict không đúng định dạng hoặc được định dạng lại trong trường hợp của tôi?

Ví dụ:

Khi đi qua một loạt các đối tượng JSON [{ "id": 1}, { "id": 2}, { "id": 3}] qua AJAX để Django xem, QueryDict được định dạng là:

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']}> 

Làm cách nào để tôi thậm chí lặp qua json_data?

Tôi muốn để có được một cái gì đó như thế này thay vì:

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']> 

Vì vậy mà tôi có thể truy cập vào QueryDict như một cuốn từ điển và lấy json_data như một danh sách và xử lý nó theo một thứ tự nhất định: có thể chỉ là lặp qua chúng trong tuần tự danh sách đơn đặt hàng. Cái gì như:

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

Trong thực tế, giá trị mà đi vào quá trình() có thể là một từ điển của các cặp giá trị quan trọng thay vì chỉ là một số (1,2,3 vv)

Javascript:

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

views.py:

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

Nhưng trả về danh sách trống []

Tôi đã thử các khối đơn giản, tải, mục, nhận các phương thức nhưng không có phương pháp nào trong số chúng được trợ giúp.

Tôi thậm chí đã thử jQuery.param (obj, true), nhưng đó không phải là những gì tôi muốn (mặc dù hơi đóng).

Có cách nào khác tốt hơn để chuyển cấu trúc dữ liệu tổng hợp qua lại Django < -> JS qua AJAX không?

+0

Cái gì là chắc chắn sai, vì mã như được đăng chắc chắn sẽ không từ bỏ mà kết quả QueryDict. Xin vui lòng bạn có thể gửi mã chính xác mà kết quả đầu ra đó? –

+0

Tôi sợ mã JS là chính xác. Tôi sao chép dán cả đoạn mã JS và đầu ra của yêu cầu in từ views.py với định dạng nhỏ. 'test' là mảng các đối tượng mà tôi truyền đi. – rajivRaja

+0

Xin lỗi, sai lầm của tôi. Xem câu trả lời của tôi dưới đây. –

Trả lời

12

Bạn nên xâu chuỗi JSON của mình bằng JSON.stringify(). Điều này sẽ chuyển đổi đối tượng JSON thành định dạng chuỗi để nó có thể được phân tích cú pháp chính xác ở đầu bên kia. Ở đầu bên kia, bạn sẽ cần sử dụng json.loads() để "unstringify" đối tượng.

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" 
); 

Xem:

import json 
def insert_tc(request): 
    if request.method == 'POST':  
     ret = request.POST 
     type = ret['type'] 
     list = json.loads(ret['json_data']) 
+0

Cảm ơn! Mặc dù câu trả lời của Daniel đã kịp thời và thực sự giúp tôi vượt qua rào cản, tôi đang chuyển sang điều này để trở thành câu trả lời được chấp nhận vì JSON.stringify() thực hiện công việc một cách rõ ràng hơn. – rajivRaja

+1

JSON dường như không có sẵn trong các phiên bản cũ của IE. Nghĩ rằng ai đó muốn biết. Tuy nhiên, dường như vẫn là cách tốt nhất để làm điều đó. – misterte

7

Đây thực sự là jQuery, không phải Django, là lạ. Biến test của bạn không chứa JSON, nhưng là các đối tượng JS thực tế. jQuery, vì lý do tốt nhất được biết đến với chính nó, phân tích này thành một số định dạng rất lạ trước khi gửi bài, do đó kết quả bạn nhận được. Nếu bạn đã làm điều này thay vì (chú ý dấu ngoặc kép quanh toàn bộ điều):

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

bạn muốn tìm bạn sẽ thấy rất gần QueryDict bạn mong đợi: điều duy nhất thì bạn cần phải làm là để gọi json.loads(ret['json_data']).

Cũng vì những lý do mà tôi không thể hiểu được. jQuery không chứa bất kỳ chức năng nào để chuyển đổi mảng đối tượng của bạn thành JSON. Bạn sẽ cần phải tìm một plugin hoặc thư viện riêng cho điều đó.

+1

Lòng tin của tôi đối với nhân loại đã được khôi phục. Cảm ơn bạn! Tôi gần như đã làm việc đó. Nó sẽ là tuyệt vời để biết lý do đằng sau hành vi này (Một số ghi/liên kết có lẽ?) – rajivRaja

Các vấn đề liên quan