Исключить пустые / нулевые значения из сериализации JSON - PullRequest
12 голосов
/ 23 ноября 2010

Я сериализую несколько вложенных словарей в JSON, используя Python с simplejson.

Есть ли способ автоматически исключать пустые / нулевые значения?

Например, сериализовать это:

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

до

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

При использовании Jackson с Java вы можете использовать Inclusion.NON_NULL для этого. Есть ли простой эквивалент?

Ответы [ 3 ]

16 голосов
/ 23 ноября 2010
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.

8 голосов
/ 23 ноября 2010
>>> 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 предотвращает любой побочный эффект.

0 голосов
/ 23 ноября 2010
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]
...