2010-11-23 10 views
8

シンプルなJSONでPythonを使用して複数のネストされた辞書をJSONにシリアル化しています。JSONシリアライズから空値/ヌル値を除外

空白値を自動的に除外する方法はありますか?例えば

、このシリアライズ:ジャクソンを使用する場合は、あなたがこれを行うにはInclusion.NON_NULLを使用できるJavaで

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

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

を。 simplejsonに相当するものはありますか?

答えて

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

Em .... Python 3.5で 'RuntimeError:辞書のサイズを変更して反復中に'を生成する –

+0

'' 'def del_none(d): " "" 値が '' None''で空文字列がキーのこの入力を変更しないが、コピー辞書が。 子辞書もコピーされる。 他のオブジェクトがコピーされていない。 「」」 REZ = d.copy()辞書、再帰。 、Dの値.items(): 値がNoneまたは値がない場合== '': デルREZ [キー] ELIFのでisinstance(値、辞書): REZ [キー] = del_none(値) 戻り再z''' –

+1

@AleksandrPanzin:Python 3の対象となるコードをPython 2のために更新しました。これは7年前に書かれました!私はその場での変更として残しました。 –

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

もしd [k]が 'd [k]'ではなく '' d '[k]ではないなら、 '' d' [k]は使用しないほうが安全です。そうでなければ空文字列と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を削除して新しい辞書を作成すると、すべての副作用が防止されます。

関連する問題