Python удаляет свойства JSON во вложенных данных JSON (или dict) - PullRequest
0 голосов
/ 19 октября 2018

У меня есть некоторая вложенная структура данных JSON, такая как:

my_dict = {
    "audits": [
        {
            "id": 1,
            "author_id": 15,
            "events": [
                {
                    "id": 307,
                    "type": "Comment",
                    "body": "*Ticket #25*",
                    "plain_body": "Ticket #25",
                    "public": False,
                    "attachments": [],
                    "audit_id":1
                },
                {
                    "id": 308,
                    "type": "Change",
                    "value": "solved",
                    "field_name": "status",
                    "previous_value": "open"
                }
            ],
            "ticket_id": 25
        }
    ]
}

Список аудитов может содержать много элементов, и каждый аудит может иметь много «событий».Я хочу удалить свойства "body" и "plain_body" из каждого "события", если они присутствуют, прежде чем продолжить его обработку.Я попытался зациклить его и удалить, если нашел ключи:

for k1 in my_dict.keys():
    i = 0
    for l2 in my_dict[k1]:
        for l3 in l2.keys():
            if l3 == 'events':
                j = 0
                for l4 in my_dict[k1][i][l3]:
                    for l5 in l4.keys():
                        if l5 in ('body', 'plain_body'):
                            print("Found key to delete: '{0}'".format(l5))
                            print(my_dict[k1][i][l3][j][l5])
                            # del my_dict[k1][i][l3][j][l5]
        i += 1

Помимо того, что такой подход к копанию структуры данных кажется совсем не пифоническим, я не могу удалить его из разногласийпока я перебираю его:

RuntimeError: словарь изменил размер во время итерации

Может кто-нибудь предоставить питонский способ просмотра JSON и удаления нежелательных свойств?Я нашел решения для этого с помощью простых неиерархических диктовок, но с вложенными.

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

почему бы не создать новый dict и назначить ключ и значение, которые вам нужны?Вы можете использовать, если решение, чтобы проверить поле, которое вам нужно!

0 голосов
/ 19 октября 2018

Вместо того, чтобы все повторять, перейдите напрямую, чтобы у вас не было RuntimeError:

for audit in my_dict["audits"]:
    for event in audit["events"]:
        if "plain_body" in event:
            del event["plain_body"]
        if "body" in event:
            del event["body"]
...