#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 строк в вашем журнале вывода.