2012-07-10 9 views
7

मैं चाहता हूं कि जेसन में एन्कोड किए जाने के लिए पाइथन का None खाली स्ट्रिंग कैसे करें? नीचे json.dumps का डिफ़ॉल्ट व्यवहार है।पायथन: कैसे जेसन डंप स्ट्रिंग खाली करने के लिए कोई नहीं

>>> import json 
>>> json.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}]) 
'["foo", {"bar": ["baz", null, 1.0, 2]}]' 

क्या मुझे जेसन एन्कोडर विधि को ओवरराइट करना चाहिए या क्या कोई अन्य तरीका है?

धन्यवाद!

संपादित

इनपुट डेटा हर का अनुरोध पर यह अलग डेटा संरचना करने के लिए बदला जा सकता है, कि ऊपर के उदाहरण में के रूप में सरल नहीं है। डेटा संरचना बदलने के लिए एक समारोह लिखना मुश्किल है।

+2

यदि आप असली जवाब चाहते हैं तो आपको बेहतर औचित्य प्रदान करने की आवश्यकता होगी ... –

+0

मेरा इनपुट डेटा उपर्युक्त उदाहरण में इतना आसान नहीं है, इसलिए मैं 'स्ट्रिंग स्ट्रिंग में 'कोई नहीं' बदलना चाहता हूं 'json.dumps' के माध्यम से। – Ahsan

+1

यह ध्यान दिया जाना चाहिए कि 'कोई नहीं' खाली स्ट्रिंग के समान नहीं है; तो कनवर्ट करते समय इसे ध्यान में रखें। 'None' के सही समतुल्य 'शून्य' –

उत्तर

8

ऑब्जेक्ट में आप एन्कोडिंग कर रहे हैं, None की बजाय खाली स्ट्रिंग का उपयोग करें।

यहां एक अनचाहे फ़ंक्शन है जो सभी None मानों को '' में बदलने के लिए नेस्टेड शब्दकोशों की एक श्रृंखला के माध्यम से चलता है। सूचियों और tuples के लिए समर्थन जोड़ना पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है। :)

import copy 

def scrub(x): 
    ret = copy.deepcopy(x) 
    # Handle dictionaries. Scrub all values 
    if isinstance(x, dict): 
     for k,v in ret.items(): 
      ret[k] = scrub(v) 
    # Handle None 
    if x == None: 
     ret = '' 
    # Finished scrubbing 
    return ret 
3

यह डेटा आप सांकेतिक शब्दों में बदलना और रिक्त स्ट्रिंग के साथ None रों बदलना चाहते हैं पर कार्रवाई करने के बेहतर होगा। आखिरकार, यही वही है जो आप चाहते हैं।

def scrub(x): 
    # Converts None to empty string 
    ret = copy.deepcopy(x) 
    # Handle dictionaries, lits & tuples. Scrub all values 
    if isinstance(x, dict): 
     for k, v in ret.items(): 
      ret[k] = scrub(v) 
    if isinstance(x, (list, tuple)): 
     for k, v in enumerate(ret): 
      ret[k] = scrub(v) 
    # Handle None 
    if x is None: 
     ret = '' 
    # Finished scrubbing 
    return ret 

जब jsonschmea मॉड्यूल का उपयोग कर मैं इसे इस्तेमाल किया:

2

यहाँ एक से थोड़ा सुधार हुआ संस्करण है कि सूचियों और tuples रूप में अच्छी तरह संभालती है। ऐसा लगता है कि यह None प्रकार को संभाल नहीं सकता है, और फेंकता है: jsonschema.exceptions.ValidationError: None is not of type u'string'। तो यह समस्या का ख्याल रखता है।

संबंधित मुद्दे