2012-04-05 11 views
11

से जेएसओएन ऑब्जेक्ट्स के एरे को पढ़ना मैं जेएस से सर्वर सर्वर पर AJAX कॉल के माध्यम से एक समग्र JSON संरचना कैसे पास करूं, इसे पायथन में "बहुत समान" डेटा संरचना के रूप में पढ़ूं?Django: QueryDict

मैं समझता हूं कि जेसन स्वरूपण का उपयोग किया जा सकता है (सरलजॉन इत्यादि), लेकिन मुझे लगता है कि QueryDict स्वयं को मेरे मामले में विकृत या सुधारित किया गया है?

उदाहरण:

जब JSON ऑब्जेक्ट की एक सरणी गुजर [{ "id": 1}, { "id": 2}, { "id": 3}] Django को देखने के लिए AJAX के माध्यम से, 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']) 

वास्तव में मूल्य है कि इस प्रक्रिया (में चला जाता है) के बजाय कुंजी मान जोड़ों का एक और शब्दकोश सिर्फ एक संख्या (1,2,3 आदि)

जावास्क्रिप्ट हो सकता है:

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) 

लेकिन सूची लौटाती खाली []

मैंने कोशिश की simplejson उदासीनता, भार, आइटम, तरीकों मिल लेकिन उनमें से कोई मदद की।

मैंने jQuery.param (obj, true) भी कोशिश की, लेकिन यह वही नहीं है जो मैं चाहता हूं (हालांकि कुछ हद तक बंद है)।

क्या समग्र डेटा संरचनाओं को आगे और आगे पास करने के लिए एक अलग/बेहतर तरीका है Django < -> जेएस AJAX के माध्यम से?

+0

कुछ है, निश्चित रूप से गलत है। क्या आप उस सटीक कोड को पोस्ट कर सकते हैं जो आउटपुट करता है? –

+0

मुझे डर है कि जेएस कोड सटीक है। मैं कॉपी करता हूं कि जेएस स्निपेट और मामूली स्वरूपण के साथ scen.py से प्रिंट अनुरोध का आउटपुट कॉपी किया गया है। 'टेस्ट' ऑब्जेक्ट्स की सरणी है जिसे मैं गुजर रहा हूं। – rajivRaja

+0

क्षमा करें, मेरी गलती। नीचे मेरा जवाब देखें। –

उत्तर

12

आपको JSON.stringify() का उपयोग करके अपने JSON को स्ट्रिंग करना चाहिए। यह JSON ऑब्जेक्ट को स्ट्रिंग प्रारूप में परिवर्तित कर देगा ताकि इसे दूसरे छोर पर सही ढंग से पार्स किया जा सके। दूसरी तरफ आपको ऑब्जेक्ट को "unstringify" करने के लिए json.loads() का उपयोग करने की आवश्यकता होगी।

जावास्क्रिप्ट:

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

देखें: क्योंकि कोड के रूप में तैनात निश्चित रूप से है कि QueryDict परिणाम नहीं देना होगा

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

धन्यवाद! हालांकि डैनियल का जवाब समय पर था और वास्तव में मुझे बाधा से दूर करने में मदद मिली, लेकिन मैं इसे स्वीकार कर रहा हूं क्योंकि JSON.stringify() नौकरी को और अधिक साफ करता है। – rajivRaja

+1

जेएसओ आईई के पुराने संस्करणों में उपलब्ध नहीं प्रतीत होता है। सोचा कि कोई जानना चाहता है। हालांकि, ऐसा करने का सबसे अच्छा तरीका अभी भी लगता है। – misterte

7

यह वास्तव में jQuery है, Django नहीं, अजीब है। आपके test चर में JSON नहीं है, लेकिन वास्तविक जेएस ऑब्जेक्ट्स हैं। jQuery, स्वयं को ज्ञात कारणों के लिए, इसे पोस्ट करने से पहले कुछ अजीब प्रारूप में पार्स करता है, इसलिए परिणाम आपको मिलता है। आप इस के बजाय किया है (ध्यान दें पूरी बात के आसपास उद्धरण): केवल एक चीज आप तो सब करने की ज़रूरत json.loads(ret['json_data']) कॉल करने के लिए है:

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

आप आप बहुत लगभग QueryDict आप उम्मीद मिल पाते हैं।

ऐसे कारणों से भी जिन्हें मैं समझ नहीं पा रहा हूं। jQuery में ऑब्जेक्ट्स की सरणी को JSON में कनवर्ट करने के लिए कोई कार्यक्षमता नहीं है। इसके लिए आपको एक प्लगइन या अलग पुस्तकालय खोजने की आवश्यकता होगी।

+1

मानवता में मेरा विश्वास बहाल कर दिया गया है। धन्यवाद! मुझे लगभग यह काम मिल गया। इस व्यवहार के पीछे कारण जानना बहुत अच्छा होगा (शायद कुछ लेखन/लिंक शायद?) – rajivRaja