Python 2.7版
>>> json.loads('{"key":null,"key2":"yyy"}')
{u'key2': u'yyy', u'key': None}
以上是默认行为。我想要的是结果:
{u'key2': u'yyy'}
有什么建议吗?非常感谢!
答案 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
请注意,它将更改您现有的字典。