2013-01-10 13 views
22

मैं JSON को अपनी mysql क्वेरी के आउटपुट आउटपुट करने का प्रयास कर रहा हूं। मैं datetime.datetime क्षेत्र serializing के साथ समस्या है, तो मैं छोटा सा समारोह ने लिखा है कि ऐसा करने के लिए: मुख्य कोड में मैं बस चल रहा हूँजेएसओएन को आउटपुट को सीरियलाइज करना - वैल्यूएरर: परिपत्र संदर्भ

def date_handler(obj): 
    if hasattr(obj, 'isoformat'): 
     return obj.isoformat() 
    else: 
     return obj 

और उसके बाद:

products_json = [] 
for code in best_matching_codes: 
    cur = db.cursor() 
    query = "SELECT * FROM %s WHERE code LIKE '%s'" % (PRODUCTS_TABLE_NAME, product_code) 
    cur.execute(query) 
    columns = [desc[0] for desc in cur.description] 
    rows = cur.fetchall() 
    for row in rows: 
     products_json.append(dict((k,v) for k,v in zip(columns,row))) 

return json.dumps(products_json, default = date_handler) 

हालांकि, बाद से मैंने लिखा date_handler फ़ंक्शन, मुझे "ValueError: परिपत्र संदर्भ पता चला है"

127.0.0.1 - - [10/Jan/2013 00:42:18] "GET /1/product?code=9571%2F702 HTTP/1.1" 500 - 
Traceback (most recent call last): 
    File "/Library/Python/2.7/site-packages/flask/app.py", line 1701, in __call__ 
return self.wsgi_app(environ, start_response) 
    File "/Library/Python/2.7/site-packages/flask/app.py", line 1689, in wsgi_app 
response = self.make_response(self.handle_exception(e)) 
    File "/Library/Python/2.7/site-packages/flask/app.py", line 1687, in wsgi_app 
response = self.full_dispatch_request() 
    File "/Library/Python/2.7/site-packages/flask/app.py", line 1360, in full_dispatch_request 
rv = self.handle_user_exception(e) 
    File "/Library/Python/2.7/site-packages/flask/app.py", line 1358, in full_dispatch_request 
rv = self.dispatch_request() 
    File "/Library/Python/2.7/site-packages/flask/app.py", line 1344, in dispatch_request 
return self.view_functions[rule.endpoint](**req.view_args) 
    File "/Users/pisarzp/Desktop/SusyChoosy/susyAPI/test1.py", line 69, in product_search 
return json.dumps(products_json, default = date_handler) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 238, in dumps 
**kw).encode(obj) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 201, in encode 
chunks = self.iterencode(o, _one_shot=True) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 264, in iterencode 
return _iterencode(o, 0) 
ValueError: Circular reference detected 

मैंने क्या तोड़ दिया? JSON पर आउटपुट को क्रमबद्ध करने का कोई बेहतर तरीका है?

+0

क्या आप product_json के लिए प्रिंट आउटपुट प्राप्त कर सकते हैं? मुझे लगता है कि तारीख के साथ कुंजी के बीच कुछ डुप्लीकेट किया गया है। फिर यह एक ही त्रुटि मिल सकती है। – jinghli

उत्तर

14

फ़ंक्शन जिसे आप default तर्क के रूप में पास करते हैं, केवल उन ऑब्जेक्ट्स के लिए बुलाया जाएगा जो json मॉड्यूल द्वारा क्रमिक रूप से क्रमबद्ध नहीं हैं। इसे एक धारावाहिक वस्तु वापस करनी होगी, या टाइप एरर बढ़ाएं।

आपका संस्करण वही ऑब्जेक्ट देता है जो आपको पारित किया गया है यदि यह एक प्रकार का नहीं है जिसे आप ठीक कर रहे हैं (तिथियां)। यह परिपत्र संदर्भ त्रुटि उत्पन्न कर रहा है (जो भ्रामक है, क्योंकि सर्कल date_handler द्वारा संसाधित होने के बाद एक ऑब्जेक्ट के बीच है)।

आप else ब्लॉक में अपवाद बढ़ाने के लिए date_handler को बदलकर इसे ठीक करना शुरू कर सकते हैं। यही कारण है कि अभी भी शायद विफल हो जाएगा, लेकिन आप शायद तब पता लगा सकते हैं क्या आपत्ति यह है कि इस तरह कोड का उपयोग कर समस्या का कारण अपने डेटा संरचना में है:

def date_handler(obj): 
    if hasattr(obj, 'isoformat'): 
     return obj.isoformat() 
    else: 
     raise TypeError(
      "Unserializable object {} of type {}".format(obj, type(obj)) 
     ) 
8

लेखन त्रुटि अपने आप को ऊपर उठाने की जगह में, आप रिले चाहिए JSONEncoder के डिफ़ॉल्ट-विधि करने के लिए कॉल:

def date_handler(obj): 
    if hasattr(obj, 'isoformat'): 
     return obj.isoformat() 
    else: 
     json.JSONEncoder.default(self,obj) 

यह भी लेखन त्रुटि उठाते हैं और एक बेहतर अभ्यास है, यह JSONEncoder कोशिश करते हैं और प्रकार अपने विधि नहीं कर सकते हैं सांकेतिक शब्दों में बदलना करने के लिए अनुमति देता है।

+2

मुझे 'NameError: वैश्विक नाम 'self' परिभाषित नहीं किया गया है ' – HereHere

+0

बस str (obj) – GBrian

+0

लौटने का प्रयास करें मुझे जेसन के अंदर सरणी सूची के साथ एक ही समस्या है और परिवर्तनीय नाम बदल गया है तो त्रुटि मिली है –

0
json.dumps(obj,default = method_name) 

method_name फ़ंक्शन को क्रमबद्ध ऑब्जेक्ट वापस करना होगा।

def method_name(obj): 
    data = {'__class__':obj.__class__.__name__, 
       '__module__':obj.__module__ 
       } 
    data.update(obj.__dict__) 
    return data`#data is dict object in this case 
संबंधित मुद्दे