Python JSON 解析重复记录

sas*_*ero 2 python json

在我的 JSON 文件中,我有一系列同名记录

"ability_upgrades":{
    "ability":5155,
    "time":1226
},
"ability_upgrades":{
    "ability":5155,
    "time":1426
},
"ability_upgrades":{
    "ability":5155,
    "time":1497
},
"ability_upgrades":{
    "ability":5157,
    "time":1543
},
Run Code Online (Sandbox Code Playgroud)

如果我将使用json.loads它只会保存最后的记录。
如果我想要一个列表,我必须做什么ability_upgrades

zw3*_*324 5

该文件说,一个叫参数object_pairs_hookjson.loads 可以用于处理重复记录:

>>> json.loads(s, object_pairs_hook=(lambda x:  x))
[(u'ability_upgrades', [(u'ability', 5155), (u'time', 1226)]), (u'ability_upgrades', [(u'ability', 5155), (u'time', 1426)]), (u'ability_upgrades', [(u'ability', 5155), (u'time', 1497)]), (u'ability_upgrades', [(u'ability', 5157), (u'time', 1543)])]
Run Code Online (Sandbox Code Playgroud)

该函数的定义方式完全取决于您希望它是什么。在上面的示例中,由于该钩子将一组对列表作为参数,因此标识函数只是将列表返回。

例如,如果您定义:

def collectAbilityUpgrades(s):
    d = {}
    for k, v in s:
        if k not in d:
            d[k] = []
        d[k].append(v)
    return d
Run Code Online (Sandbox Code Playgroud)

然后:

>>> json.loads(s, object_pairs_hook=collectAbilityUpgrades)
{u'ability_upgrades': [{u'ability': [5155], u'time': [1226]}, {u'ability': [5155], u'time': [1426]}, {u'ability': [5155], u'time': [1497]}, {u'ability': [5157], u'time': [1543]}]}
Run Code Online (Sandbox Code Playgroud)

这可能与您想要的相似。