Исключить пустые / нулевые значения из сериализации JSON
Я сериализую несколько вложенных словарей в JSON, используя Python с simplejson.
есть ли способ, чтобы автоматически исключить пустые/нулевые значения?
например, сериализовать этот:
{
"dict1" : {
"key1" : "value1",
"key2" : None
}
}
to
{
"dict1" : {
"key1" : "value1"
}
}
при использовании Jackson с Java вы можете использовать Inclusion.NON_NULL
для этого. Есть ли эквивалент simplejson?
3 ответов
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
.
>>> 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
removed предотвращает весь побочный эффект.
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]