繁体   English   中英

如何读取 JSON 中没有数字索引的字段

[英]How to read fields without numeric index in JSON

我有一个 json 文件,我需要以结构化的方式读取它以在数据库中插入其各自列中的每个值,但在标签"customFields"中,字段更改索引,例如: "Tribe / Customer"可以是索引 0 (row['customFields'][0])在 json 块中,另一个是索引 3 (row['customFields'][3]) ,所以我尝试使用行字段的名称读取数据['customFields'] ['Tribe / Customer'] ,但我收到以下错误:

TypeError:列表索引必须是整数或切片,而不是 str

脚本:

def getCustomField(ModelData):

    for row in ModelData["data"]["squads"][0]["cards"]:

        print(row['identifier'],
              row['customFields']['Tribe / Customer'],
              row['customFields']['Stopped with'],
              row['customFields']['Sub-Activity'],
              row['customFields']['Activity'],
              row['customFields']['Complexity'],
              row['customFields']['Effort'])
            
    
if __name__ == "__main__":
    f = open('test.json')
    json_file = json.load(f)
    getCustomField(json_file)

JSON:

{
    "data": {
        "squads": [
            {
                "name": "TESTE",
                "cards": [
                    {
                        "identifier": "0102",
                        "title": "TESTE",
                        "description": " TESTE ",
                        "status": "on_track",
                        "priority": null,
                        "assignees": [
                            {
                                "fullname": "TESTE",
                                "email": "TESTE"
                            }
                        ],
                        "createdAt": "2020-04-16T15:00:31-03:00",
                        "secondaryLabel": null,
                        "primaryLabels": [
                            "TESTE",
                            "TESTE"
                        ],
                        "swimlane": "TESTE",
                        "workstate": "Active",
                        "customFields": [
                            {
                                "name": "Tribe / Customer",
                                "value": "TESTE 1"
                            },
                            {
                                "name": "Checkpoint",
                                "value": "GNN"
                            },
                            {
                                "name": "Stopped with",
                                "value": null
                            },
                            {
                                "name": "Sub-Activity",
                                "value": "DEPLOY"
                            },
                            {
                                "name": "Activity",
                                "value": "TOOL"
                            },
                            {
                                "name": "Complexity",
                                "value": "HIGH"
                            },
                            {
                                "name": "Effort",
                                "value": "20"
                            }
                        ]
                    },
                    {
                        "identifier": "0103",
                        "title": "TESTE",
                        "description": " TESTE ",
                        "status": "on_track",
                        "priority": null,
                        "assignees": [
                            {
                                "fullname": "TESTE",
                                "email": "TESTE"
                            }
                        ],
                        "createdAt": "2020-04-16T15:00:31-03:00",
                        "secondaryLabel": null,
                        "primaryLabels": [
                            "TESTE",
                            "TESTE"
                        ],
                        "swimlane": "TESTE",
                        "workstate": "Active",
                        "customFields": [
                            {
                                "name": "Tribe / Customer",
                                "value": "TESTE 1"
                            },
                            {
                                "name": "Stopped with",
                                "value": null
                            },
                            {
                                "name": "Checkpoint",
                                "value": "GNN"
                            },
                            {
                                "name": "Sub-Activity",
                                "value": "DEPLOY"
                            },
                            {
                                "name": "Activity",
                                "value": "TOOL"
                            },
                            {
                                "name": "Complexity",
                                "value": "HIGH"
                            },
                            {
                                "name": "Effort",
                                "value": "20"
                            }
                        ]
                    }
                ]
            }
        ]
    }
}

您必须将自定义字段列表解析为您可以按名称访问的内容。 由于您要访问同一个列表中的多个条目,因此字典是最合适的选择。

for row in ModelData["data"]["squads"][0]["cards"]:
    custom_fields_dict = {field['name']: field['value'] for field in row['customFields']}
    print(row['identifier'],
          custom_fields_dict['Tribe / Customer'],
          ...
         )

如果您只想要一个字段,您可以遍历列表以查找匹配项,但重复执行此操作会降低效率。

我正在跳过处理缺失的字段 - 如果 json 列表中可能不存在该字段,您可能想要使用get('Tribe / Customer', some_reasonable_default)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM