您可以将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,如果有多个具有给定键的项目,则值是列表。
Python 文档中对钩子的描述如下:
object_pairs_hook 是一个可选函数,将调用使用有序对列表解码的任何对象文字的结果。将使用 object_pairs_hook 的返回值而不是 dict。此功能可用于实现依赖于键值对解码顺序的自定义解码器(例如,collections.OrderedDict() 将记住插入顺序)。如果还定义了 object_hook,则 object_pairs_hook 优先。