【问题标题】:Parse Nester JSON in Python在 Python 中解析嵌套的 JSON
【发布时间】:2018-09-12 05:24:21
【问题描述】:

所以我在这里被难住了...我正在尝试从 API 中过滤 JSON 结果,但在查找下面的嵌套“playerID”并将整个 JSON 块输出到“类型”时遇到问题

JSON

{
    "included": [
    {
        "type": "participant",
        "id": "efb753a7-bc6b-4cf0-925a-df4693b51690",
        "attributes": {
            "actor": "",
            "shardId": "pc-na",
            "stats": {
                "DBNOs": 0,
                "assists": 0,
                "boosts": 0,
                "damageDealt": 21.78,
                "deathType": "byplayer",
                "headshotKills": 0,
                "heals": 1,
                "killPlace": 69,
                "killPoints": 1204,
                "killPointsDelta": -12.1259718,
                "killStreaks": 0,
                "kills": 0,
                "lastKillPoints": 0,
                "lastWinPoints": 0,
                "longestKill": 0,
                "mostDamage": 0,
                "name": "AshTrayyyyyyyy",
                "playerId": "account.a6e705568e1e490189d59606892765a9",
                "revives": 0,
                "rideDistance": 0,
                "roadKills": 0,
                "teamKills": 0,
                "timeSurvived": 293,
                "vehicleDestroys": 0,
                "walkDistance": 197.17308,
                "weaponsAcquired": 0,
                "winPlace": 28,
                "winPoints": 1152,
                "winPointsDelta": -4.64524174
            }
        }
    },
    {
        "type": "participant",
        "id": "e916ce2e-aea4-4806-9aa1-449113df793c",
        "attributes": {
            "actor": "",
            "shardId": "pc-na",
            "stats": {
                "DBNOs": 0,
                "assists": 0,
                "boosts": 1,
                "damageDealt": 54.3429337,
                "deathType": "byplayer",
                "headshotKills": 0,
                "heals": 7,
                "killPlace": 56,
                "killPoints": 1185,
                "killPointsDelta": -5.10656166,
                "killStreaks": 0,
                "kills": 0,
                "lastKillPoints": 0,
                "lastWinPoints": 0,
                "longestKill": 0,
                "mostDamage": 0,
                "name": "PanzerCheneyJr",
                "playerId": "account.380f694417594236a8dc9f5dcc0b0ed5",
                "revives": 0,
                "rideDistance": 1869.12939,
                "roadKills": 0,
                "teamKills": 0,
                "timeSurvived": 1476,
                "vehicleDestroys": 0,
                "walkDistance": 2950.75659,
                "weaponsAcquired": 0,
                "winPlace": 10,
                "winPoints": 1184,
                "winPointsDelta": 15.2799187
            }
        }
    },
    {
        "type": "roster",
        "id": "f876ef81-bd51-494b-9cf0-49d4da725ff0",
        "attributes": {
            "shardId": "pc-na",
            "stats": {
                "rank": 40,
                "teamId": 11
            },
            "won": "false"
        },
        "relationships": {
            "participants": {
                "data": [
                    {
                        "type": "participant",
                        "id": "0c936615-eb39-42f8-bbe3-5b17bcf6c7dd"
                    },
                    {
                        "type": "participant",
                        "id": "62a6ed31-f5bf-4b0a-b867-8260774dcb90"
                    }
                ]
            },
            "team": {
                "data": null
            }
        }
    },
    {
        "type": "participant",
        "id": "8b63d4d9-a673-48d8-9e56-cfe2109044d8",
        "attributes": {
            "actor": "",
            "shardId": "pc-na",
            "stats": {
                "DBNOs": 1,
                "assists": 1,
                "boosts": 5,
                "damageDealt": 466.477539,
                "deathType": "byplayer",
                "headshotKills": 0,
                "heals": 4,
                "killPlace": 3,
                "killPoints": 1105,
                "killPointsDelta": 54.3647232,
                "killStreaks": 0,
                "kills": 4,
                "lastKillPoints": 0,
                "lastWinPoints": 0,
                "longestKill": 74,
                "mostDamage": 0,
                "name": "JustFallen",
                "playerId": "account.1ea2035542e44f37bb2b7a3679a91fcc",
                "revives": 0,
                "rideDistance": 1945.68457,
                "roadKills": 0,
                "teamKills": 0,
                "timeSurvived": 1561,
                "vehicleDestroys": 0,
                "walkDistance": 2272.8418,
                "weaponsAcquired": 0,
                "winPlace": 4,
                "winPoints": 1179,
                "winPointsDelta": 28.698019
            }
        }
    }
}

对于 Python,这是我完全难过的地方。我要做的是返回整个参与者块,以及嵌套在其中的所有内容。但我需要通过属性 -> stats 下的“playerID”进行过滤。

这是我尝试过的 Python...

Python

included = (data['included'])
included = json.dumps(included)
input_dict = json.loads(included)
print(playerid)
for d in input_dict:
    for key, value in d.iteritems():
        print (key, value)
output_dict = [x for x in input_dict if x['playerID'] == playerid]
output_json = json.dumps(output_dict)
print(output_json)

非常感谢任何帮助。

【问题讨论】:

  • 您在此处粘贴的内容不是有效的 JSON。看起来included 是一个dicts 数组,但没有] 可以关闭数组。
  • 同时,你为什么要做一个dumps 只是为了在结果字符串上做一个loads?
  • 我只是复制了整个 JSON 的一个片段,太长了无法发布。当我没有进行转储然后加载时遇到问题...我知道它不是有效的 JSON,但这就是我从 API 中提取它的方式,我无能为力。
  • 我不相信您可能拥有任何数据,其中转储后立即加载可以解决任何问题。那只是挥舞着一根棍子,希望它是一根魔杖。而且,您的实际数据不是有效的 JSON 也不可能是真的,或者您无法转储并加载它,因此您在此处发布的内容不是您问题的有效示例。请阅读帮助中的minimal reproducible example,了解如何创建一个无需猜测即可回答的问题(通常最终得到一个无法回答您实际问题的答案)。

标签: python arrays json


【解决方案1】:

您似乎很清楚如何转储和加载 JSON,所以这里是过滤的部分:

playerid = 'account.380f694417594236a8dc9f5dcc0b0ed5'
new_data = [x
            for x in data['included']
            if x['type'] == 'participant' and
               x['attributes']['stats']['playerId'] == playerid]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多