Как читать поля без числа c индекса в JSON - PullRequest
0 голосов
/ 10 июля 2020

У меня есть файл json, где мне нужно прочитать его в структурированном виде, чтобы вставить в базу данных каждое значение в соответствующем столбце, но в теге "customFields" поля меняют индекс, например: "Tribe / Customer" может быть индексом 0 (row['customFields'][0]) в блоке json, а в другом - индексом 3 (row['customFields'][3]), поэтому я попытался прочитать данные, используя имя поля строки ['customFields'] ['Tribe / Customer'], но я получил следующую ошибку:

TypeError: индексы списка должны быть целыми числами или срезами, а не str

Script:

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"
                            }
                        ]
                    }
                ]
            }
        ]
    }
}

1 Ответ

1 голос
/ 10 июля 2020

Вам нужно будет преобразовать список настраиваемых полей во что-то, к чему вы можете получить доступ по имени. Поскольку вы получаете доступ к нескольким записям из одного и того же списка, словарь является наиболее подходящим выбором.

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'],
          ...
         )

Если вам нужно только одно поле, вы можете просмотреть список в поисках совпадения, но это будет менее эффективно делать это неоднократно.

Я пропускаю работу с отсутствующими полями - вы, вероятно, захотите использовать get('Tribe / Customer', some_reasonable_default), если есть вероятность того, что поле не присутствует в списке json.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...