有没有办法配置Python的JSON库来忽略调用json.loads()时具有空值的字段?

时间:2014-01-28 17:00:52

标签: python json

Python 2.7版

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

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

{u'key2': u'yyy'}

有什么建议吗?非常感谢!

2 个答案:

答案 0 :(得分:12)

您可以在加载后过滤结果:

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

或者你可以在object_hook callable中执行此操作:

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'}

答案 1 :(得分:0)

在找到此问题之前,我写了以下解决方案。使用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

请注意,它将更改您现有的字典。