2010-11-23 15 views
8

से रिक्त/शून्य मान बहिष्कृत करें मैं सरलसन के साथ पायथन का उपयोग कर JSON में एकाधिक नेस्टेड शब्दकोशों को क्रमबद्ध कर रहा हूं।JSON serialization

क्या खाली/शून्य मान स्वचालित रूप से बाहर करने का कोई तरीका है? जावा के साथ जैक्सन का उपयोग करते समय आप Inclusion.NON_NULL उपयोग कर सकते हैं यह करने के लिए

{ 
    "dict1" : { 
    "key1" : "value1", 
    "key2" : None 
    } 
} 

{ 
    "dict1" : { 
    "key1" : "value1" 
    } 
} 

रहे हैं:

उदाहरण के लिए, इस को क्रमानुसार। क्या एक साधारणज समकक्ष है?

उत्तर

11
def del_none(d): 
    """ 
    Delete keys with the value ``None`` in a dictionary, recursively. 

    This alters the input so you may wish to ``copy`` the dict first. 
    """ 
    # For Python 3, write `list(d.items())`; `d.items()` won’t work 
    # For Python 2, write `d.items()`; `d.iteritems()` won’t work 
    for key, value in list(d.items()): 
     if value is None: 
      del d[key] 
     elif isinstance(value, dict): 
      del_none(value) 
    return d # For convenience 

नमूना उपयोग:

>>> mydict = {'dict1': {'key1': 'value1', 'key2': None}} 
>>> print(del_none(mydict.copy())) 
{'dict1': {'key1': 'value1'}} 

तो फिर तुम json है कि फ़ीड कर सकते हैं।

+0

एम .... यह 'रनटाइम एरर: पियथन 3.5 –

+0

'' 'def del_none (डी): " " मान के साथ कुंजी हटाएं' 'कोई नहीं'' और खाली स्ट्रिंग में' शब्दकोश, रिकर्सिवली। इस इनपुट को बदल नहीं है, लेकिन प्रतियां बाल शब्दकोश। शब्दकोशों भी कॉपी कर रहे हैं। कोई अन्य वस्तुओं कॉपी कर रहे हैं। "" " rez = d.copy() कुंजी के लिए , घ में मूल्य .items(): यदि मान कोई नहीं है या मान == '': डेल रीज़ [कुंजी] एलिफ आईएसइंस्टेंस (मान, dict): rez [key] = del_none (value) वापस लौटें z''' –

+1

@ एलेक्ज़ेंडरपांज़िन: मैंने पायथन 3 के लिए नोट्स के साथ पायथन 3 को लक्षित करने के लिए कोड अपडेट किया है। यह * सात साल पहले लिखा गया था! हालांकि, मैंने इसे एक जगह में संशोधन के रूप में छोड़ दिया। –

0
def excludeNone(d): 
    for k in list(d): 
     if k in d: 
      if type(d[k]) == dict: 
       excludeNone(d[k]) 
      if not d[k]: 
       del d[k] 
+4

'अगर डी [के] नहीं है तो' 'डी' के बजाय 'कोई नहीं है' का उपयोग करना सुरक्षित होगा - अन्यथा रिक्त तार और 0 मान भी आउटपुट से बाहर किए जाएंगे। –

6
>>> def cleandict(d): 
...  if not isinstance(d, dict): 
...   return d 
...  return dict((k,cleandict(v)) for k,v in d.iteritems() if v is not None) 
... 
>>> mydict = dict(dict1=dict(key1='value1', key2=None)) 
>>> print cleandict(mydict) 
{'dict1': {'key1': 'value1'}} 
>>> 

मैं सामान्य रूप में del का उपयोग कर, बदलते मौजूदा शब्दकोश वे कैसे बनाए जाते हैं पर निर्भर करता है सूक्ष्म प्रभाव हो सकता है पसंद नहीं है। None हटाए गए नए शब्दकोशों को हटाकर सभी दुष्प्रभावों को रोकता है।