好的,所以我从网页上获得了json源代码,在这个源代码中,相同的单词(“作者”)被用作多个值的键。如何检索“作者”的所有值?
E.g。
"author": "SampleMan", "author":"NonSampleMan", "author":"BoringMan"
如何让Python返回["SampleMan", "NonSampleMan", "BoringMan"]
?
答案 0 :(得分:7)
您可以将object_pairs_hook
传递给json.loads
,它会使用相同的键将值收集到列表中:
from collections import defaultdict
import json
s = '{"author": "SampleMan", "author":"NonSampleMan", "author":"BoringMan", "foo":"bar", "bar": [1]}'
def hook(pairs):
d = defaultdict(list)
for k, v in pairs:
d[k].append(v)
return {k: v if len(v) > 1 else v[0] for k, v in d.items()}
print(json.loads(s, object_pairs_hook=hook))
输出:
{'bar': [1], 'author': ['SampleMan', 'NonSampleMan', 'BoringMan'], 'foo': 'bar'}
在上面的钩子中接收list
个(key, value)
个元组,它存储到defaultdict
,其中值是列表。一旦它迭代了元组,它将生成结果dict
,其中如果有多个具有给定键的项,则值为list。
Python文档有以下钩子描述:
object_pairs_hook是一个可选函数,将使用有序的对列表对解码的任何对象文字的结果进行调用。将使用object_pairs_hook的返回值而不是dict。此功能可用于实现依赖于键和值对被解码的顺序的自定义解码器(例如,collections.OrderedDict()将记住插入的顺序)。如果还定义了object_hook,则object_pairs_hook优先。