Python-如何在类似字典的json字符串中检索与相同键关联的多个值?

时间:2017-01-07 06:45:00

标签: python arrays json hashtable reddit

好的,所以我从网页上获得了json源代码,在这个源代码中,相同的单词(“作者”)被用作多个值的键。如何检索“作者”的所有值?

E.g。

"author": "SampleMan", "author":"NonSampleMan", "author":"BoringMan"

如何让Python返回["SampleMan", "NonSampleMan", "BoringMan"]

1 个答案:

答案 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优先。