调用JSON.loads()时,是否有方法配置Python的JSON库以忽略具有空值的字段?

2024-06-04 18:16:36 发布

您现在位置:Python中文网/ 问答频道 /正文

Python 2.7版

>>> json.loads('{"key":null,"key2":"yyy"}')
{u'key2': u'yyy', u'key': None}

以上是默认行为。我想要的结果是:

{u'key2': u'yyy'}

有什么建议吗?谢谢!


Tags: keynonejsonnull建议key2yyyloads
2条回答

在找到这个问题之前,我写了下面的解决方案。使用object_hook更好,但如果需要删除已解析JSON的所有嵌套元素,可以使用以下递归函数:

def remove_nulls (d):
    if isinstance(d, dict):
        for  k, v in list(d.items()):
            if v is None:
                del d[k]
            else:
                remove_nulls(v)
    if isinstance(d, list):
        for v in d:
            remove_nulls(v)
    return d

注意它会改变你现有的字典。

加载后可以过滤结果:

res = json.loads(json_value)
res = {k: v for k, v in res.iteritems() if v is not None}

或者可以在可调用的object_hook中执行此操作:

def remove_nulls(d):
    return {k: v for k, v in d.iteritems() if v is not None}

res = json.loads(json_value, object_hook=remove_nulls)

它也将处理递归字典。

对于Python 3,使用.items()而不是.iteritems()来有效地枚举字典的键和值。

演示:

>>> import json
>>> json_value = '{"key":null,"key2":"yyy"}'
>>> def remove_nulls(d):
...     return {k: v for k, v in d.iteritems() if v is not None}
... 
>>> json.loads(json_value, object_hook=remove_nulls)
{u'key2': u'yyy'}
>>> json_value = '{"key":null,"key2":"yyy", "key3":{"foo":null}}'
>>> json.loads(json_value, object_hook=remove_nulls)
{u'key3': {}, u'key2': u'yyy'}

相关问题 更多 >