Преобразование значений списка JSON в массивы

#python

#python

Вопрос:

Я анализирую большое количество файлов json, в которых я преобразую определенные значения списка в массивы.

Например, для следующего json этот код превращает «Оператор» и «Ресурс» в массив.

 print(response['PVersion']['Document'])
{
    "Version": "---",
    "Statement": {
        "Effect": "---",
        "Action": "---",
        "Resource": "*"
    }
}

if (type(response['PVersion']['Document']['Statement'])==list):
        pass
    else:
        response['PVersion']['Document']['Statement']=[response['PVersion']['Document']['Statement']]
for elem in response['PVersion']['Document']['Statement']:
        if(type(elem['Resource'])==list):
            pass
        else:
            elem['Resource']=[elem['Resource']]
print(response['PVersion']['Document'])

Output:
{
    "Version": "---",
    "Statement": [{
        "Effect": "---",
        "Action": "---",
        "Resource": ["*"]
    }]
}
 

Тот же код Python имеет проблемы со следующим файлом json:

 print(response['PVersion']['Document'])
{
    "Statement": [{
            "Action": [
                "---"
            ],
            "Resource": "*"
        },
        {
            "Action": [
                "---"
            ],
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "---",
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "---",
            "Resource": [
                "*"
            ]
        },
        {
            "Effect": "---",
            "Resource": "*"
        },
        {
            "Effect": "---",
            "Action": [
                "---"
            ]
        },
        {
            "Effect": "---",
            "Action": [
                "---"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}
 

С идентичным кодом из первого примера я получаю следующую ошибку:

 line 59, in <module>
    if(type(elem['Resource'])==list):
KeyError: 'Resource'
 

Я попытался добавить print(elem[‘Resource’]) перед этим оператором if, чтобы увидеть, на какой ресурс он ссылается.

Вывод:

 *
['*']
['*']
['*']
*
 

Это указывает на проблему с предпоследним «Ресурсом», но я не вижу в этом ничего особенного.

Он работает с похожими файлами, где есть комбинация значений списка и массива, но по какой-то причине не на этом.

Есть идеи о том, как я мог бы это решить?

Комментарии:

1. Возможно, это опечатка, но шестой элемент инструкции в вашем примере json не имеет Resource ключа, что может вызвать KeyError

2. Ого, я думаю, в этом проблема! Поэтому, я думаю, я мог бы добавить новый оператор if перед тем, где я бы проверил, есть ли значение «Ресурс» в первую очередь.

Ответ №1:

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

 {
    "Effect": "---",
    "Action": [
        "---"
    ]
},
 

У вашего элемента нет ключевого «ресурса». Это 6-й элемент вашего ввода, который соответствует тому факту, что у вас есть 5 строк в вашем журнале вывода.