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

Bob*_*obo 10 python json

Python版本2.7

>>> json.loads('{"key":null,"key2":"yyy"}')
{u'key2': u'yyy', u'key': None}
Run Code Online (Sandbox Code Playgroud)

以上是默认行为.我想要的是成为:

{u'key2': u'yyy'}
Run Code Online (Sandbox Code Playgroud)

有什么建议?非常感谢!

Mar*_*ers 14

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

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

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

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)
Run Code Online (Sandbox Code Playgroud)

它也将处理递归字典.

对于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'}
Run Code Online (Sandbox Code Playgroud)