2012-06-04 10 views
6

मैं इस तरह एक समारोह वापस जाने के लिए कोशिश कर रहा हूँ:मैं पिरामिड के JSON एन्कोडिंग को कैसे कॉन्फ़िगर कर सकता हूं?

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='json') 
def returnJSON(color, message=None): 
    return json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default) 
पिरामिड के अपने JSON एन्कोडिंग की वजह से

, तो वह ऐसा डबल इनकोडिंग बाहर आ रहा है:

"{\"color\": \"color\", \"message\": \"message\"}" 

मैं इसे कैसे ठीक कर सकते हैं? मुझे default argument (या समतुल्य) का उपयोग करने की आवश्यकता है क्योंकि यह मोंगो के कस्टम प्रकारों के लिए आवश्यक है।

+4

यह एक अजीब स्वरूपण नहीं है। यह एक * सामान्य * स्ट्रिंग जेएसओएन प्रारूप है, यह बच निकले उद्धरणों का उपयोग करता है। – VisioN

+1

@VisioN: यह * एक स्ट्रिंग * के लिए * सामान्य JSON स्वरूपण है ... *। –

+0

अगर मैं सीधे JSON (JSON.dumps के बिना) में पास करता हूं तो मुझे त्रुटि क्यों नहीं मिलती है? – zakdances

उत्तर

8

यह शब्दकोश की तरह लगता है की जा रही दो बार के बराबर JSON-एन्कोड किया गया है,:

json.dumps(json.dumps({ "color" : "color", "message" : "message" })) 

शायद आपके अजगर ढांचे स्वचालित रूप से परिणाम JSON-एन्कोड? बजाय इस प्रयास करें:

def returnJSON(color, message=None): 
    return { "color" : "color", "message" : "message" } 

संपादित करें:

एक कस्टम पिरामिड रेंडरर कि JSON जिस तरह से आप चाहते हैं उत्पन्न करता है का उपयोग करने के लिए, यह (renderer docs और renderer sources के आधार पर) की कोशिश करो।

स्टार्टअप में:

from pyramid.config import Configurator 
from pyramid.renderers import JSON 

config = Configurator() 
config.add_renderer('json_with_custom_default', JSON(default=json_util.default)) 

तो फिर तुम उपयोग करने के लिए एक 'json_with_custom_default' रेंडरर है:

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='json_with_custom_default') 

संपादित 2

एक अन्य विकल्प Response वस्तु वापस जाने के लिए हो सकता है जो वह प्रस्तुतकर्ता को संशोधित नहीं करना चाहिए। जैसे

from pyramid.response import Response 
def returnJSON(color, message): 
    json_string = json.dumps({"color": color, "message": message}, default=json_util.default) 
    return Response(json_string) 
+0

यह काम करता है, जैसा कि मैंने पोस्ट में उल्लेख किया था। मुझे JSON.dumps का उपयोग करने की आवश्यकता है हालांकि मुझे मोंगो ऑब्जेक्ट्स को क्रमबद्ध करने के लिए डिफ़ॉल्ट = json_util.default की आवश्यकता है। – zakdances

+2

आप किस पायथन वेब ढांचे का उपयोग कर रहे हैं? आपको स्वचालित JSON एन्कोडिंग को अक्षम करने की आवश्यकता है, या जिस तरह से ढांचा JSON एन्कोडिंग करता है उसे संशोधित करने का तरीका ढूंढें। – orip

+1

मैं पिरामिड का उपयोग कर रहा हूं। यह एक रेंडरर के साथ सेट है: @view_config (path_name = 'CreateNewAccount', request_method = 'GET', renderer = 'json') – zakdances

0

आप पाइथन ऑब्जेक्ट (डिक्शनरी) के dumping the string हैं जो आप इसे दे रहे हैं।

json.dumps के लिए मैनुअल राज्यों: एक JSON स्वरूपित str को

को क्रमानुसार obj।

स्ट्रिंग से वापस कनवर्ट करने के लिए, आपको Python JSON function loads का उपयोग करने की आवश्यकता होगी जो एक JSON ऑब्जेक्ट में स्ट्रिंग को लोड करता है।

ऐसा लगता है कि आप ऐसा करने की कोशिश कर रहे हैं, encode JSON के लिए एक पायथन शब्दकोश है।

def returnJSON(color, message=None): 
    return json.encode({ "color" : color, "message" : message }) 
+0

क्या मैं json.encode का उपयोग डिफ़ॉल्ट = json_util.default के साथ कर सकता हूं? – zakdances

+0

समस्या प्रारंभिक डंप नहीं है। समस्या यह है कि यह लाइन * नीचे * एन्कोड किया जा रहा है। –

+1

मैं सहमत हूं। इसकी शायद इस पंक्ति के कारण: @view_config (path_name = 'CreateNewAccount', request_method = 'GET', renderer = 'json') – zakdances

1

आप यह नहीं कहा है, लेकिन मैं तुम सिर्फ मानक json मॉड्यूल का उपयोग कर रहे ग्रहण करेगा।

json मॉड्यूल JSON के लिए कक्षा परिभाषित नहीं करता है; यह आपके डेटा के "मूल" प्रतिनिधित्व के रूप में एक मानक पायथन dict का उपयोग करता है। json.dumps() एक JSON स्ट्रिंग के रूप में dict एन्कोड करता है; json.loads() एक JSON स्ट्रिंग लेता है और dict देता है।

बजाय ऐसा करने का:

def returnJSON(color, message=None): 
    return json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default) 

यह करके देखें:

def returnJSON(color, message=None): 
    return { "color" : "color", "message" : "message" } 

बस वापस एक सादे dict गुजरती हैं। देखें कि आपका आईफोन ऐप इसे कैसे पसंद करता है।

2

अन्य उत्कृष्ट उत्तरों के अलावा, मैं यह इंगित करना चाहता हूं कि यदि आप नहीं चाहते हैं कि आपके व्यू फ़ंक्शन द्वारा डेटा को json.dumps के माध्यम से पारित किया जाए तो आपको renderer = "json" का उपयोग नहीं करना चाहिए दृश्य विन्यास :)

तो बजाय

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='json') 
def returnJSON(color, message=None): 
    return json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default) 

तुम सिर्फ उपयोग कर सकते हैं

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='string') 
def returnJSON(color, message=None): 
    return json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default) 

string रेंडरर बस द्वारा वापस स्ट्रिंग डेटा पास अपने कार्य के रूप में है। हालांकि, एक कस्टम रेंडरर पंजीकृत करना एक अच्छा दृष्टिकोण है (देखें @ ओरिप का जवाब)

+0

यह सच है और यह वह समाधान है जिसका मैं अब उपयोग कर रहा हूं। मुझे कस्टम रेंडरर का उपयोग करने के लिए पिरामिड 1.4 जारी होने तक इंतजार करना होगा। – zakdances

+0

मुझे लगता है कि आपने प्रलेखन को गलत तरीके से पढ़ा है - लंबे समय तक पिरैमिड में कस्टम रेंडरर्स उपलब्ध हैं, मैं एक एपिकेशन में एक कस्टम रेंडरर का उपयोग कर रहा हूं क्योंकि पिरामिड को repoze.bfg कहा जाता था। http://pyramid.readthedocs.org/en/latest/narr/renderers.html#adding-a-new-renderer – Sergey

+0

मुझे और अधिक विशिष्ट होना चाहिए था ... मेरा मतलब है कि रेंडरर पैराम्स बनाने के लिए JSON() फ़ंक्शन केवल 1.4 में जोड़ा गया है – zakdances