Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从深度嵌套的JSON中提取数据_Python_Arrays_Json_Dictionary - Fatal编程技术网

Python 从深度嵌套的JSON中提取数据

Python 从深度嵌套的JSON中提取数据,python,arrays,json,dictionary,Python,Arrays,Json,Dictionary,我对JSON数据不熟悉,我正在尝试深入研究一个嵌套非常深的字典,它包含3个数组和一个JSON文件的字典。我正试着用标签播放器查字典。我试图提取所有球队的球员,然后移动到一个数据框中,以便我可以用于其他分析 如何写入循环以获取此数据 这就是我试图做的,但它不起作用: rostered = json.dumps(rostered_players) player_value = [[ values['playerPoolEntry']['player']

我对JSON数据不熟悉,我正在尝试深入研究一个嵌套非常深的字典,它包含3个数组和一个JSON文件的字典。我正试着用标签播放器查字典。我试图提取所有球队的球员,然后移动到一个数据框中,以便我可以用于其他分析

如何写入循环以获取此数据

这就是我试图做的,但它不起作用:

rostered = json.dumps(rostered_players)
player_value = [[
                values['playerPoolEntry']['player']
                ]for values in rostered]
以下是我正在处理的数据示例:

rostered = 
'''[
  [    
    {
    "appliedStatTotal": 260.05,
    "entries": [
        [
            {
            "injuryStatus": "NORMAL",
            "lineupSlotId": 2,
            "playerId": 2977644,
            "playerPoolEntry": {
                                "appliedStatTotal": 37.6,
                                "id": 2977644,
                                "keeperValue": 56,
                                "keeperValueFuture": 56,
                                "lineupLocked": false,
                                "onTeamId": 1,
                                "player":   {
                                            "firstName": "Todd",
                                            "fullName": "Todd Gurley II",
                                            "id": 2977644,
                                            "injuryStatus": "ACTIVE",
                                            "lastName": "Gurley II"
                                            },
            "rosterLocked": false,
            "tradeLocked": false
                                }
                }
            ]
        ]
    }
],
    [
        {
            "appliedStatTotal": 260.05,
            "entries": [
            [
                {
                "injuryStatus": "NORMAL",
                "lineupSlotId": 4,
                "playerId": 3892889,
                "playerPoolEntry": {
                                "appliedStatTotal": 6.6000000000000005,
                                "id": 3892889,
                                "keeperValue": 5,
                                "keeperValueFuture": 5,
                                "lineupLocked": false,
                                "onTeamId": 2,
                                "player":   {
                                            "defaultPositionId": 3,
                                            "firstName": "Dede",
                                            "fullName": "Dede Westbrook",
                                            "id": 3892889,
                                            "lastName": "Westbrook"
                                            },
            "rosterLocked": false,
            "tradeLocked": false
                                    }
                    }
                ]
            ]
        }
    ]
]'''

一种方法是使用递归。这是一种更实用的方法

from pprint import pprint

def iterate_deep(item):
  if isinstance(item, dict):
    for key, val in item.items():
      if key == 'player':
        pprint(val)
      else:
        iterate_deep(val)
  elif isinstance(item, list):
    for deeper_item in item:
      iterate_deep(deeper_item)

iterate_deep(rostered_players)

一种可能的解决方案是按原样解析给定的JSON

rostered=json.loads(rostered)
    player_values=[]
    for level0 in rostered:
        for level1 in level0:
            if 'entries' in level1:
                level2 = level1.get('entries')
                for level3 in level2:
                    for level4 in level3:
                        if 'playerPoolEntry' in level4 and 'player' in level4.get('playerPoolEntry'):
                            player_values.append(level4.get('playerPoolEntry').get('player'))

您不应该使用json.loads吗?dumps将字符串转换为jsonobject@BenKowalsky不,没有。为什么要使用递归呢?如果在树的其他部分有其他玩家键怎么办?@njzk2,因为递归是上下文无关的。显然,没有什么可以阻止他使用iterate_deep进行更深入的研究。但我不知道他的意图。我的函数只演示了一种循环数据的方法。我尝试了这种方法,但在outputsrostered=json.loadsrostered中没有返回任何值。请在运行循环之前添加此行。我已经修正了密码。