AttributeError: 'str' object has no attribute 'get'
Не могу понять в чем заключается ошибка. Пытаюсь распарсить ответ json, вот представленный код:
acc_response = requests.post(url=url, headers=headers, data=json.dumps(requestDomainAcc))
res = acc_response.json()['AccountTree']
result = []
for c in res:
c_root = c.get('root').strip()
c_items = c.get('items').strip()
for item in c_items:
item_employee_id = item.get('employee_id').strip()
item_display_name = item.get('display_name').strip()
item_login = item.get('login').strip()
item_last_activity_utc_time = item.get('last_activity_utc_time').strip()
item_is_enabled = item.get('is_enabled').strip()
result.append(
[item_employee_id, item_display_name, item_login, item_last_activity_utc_time, item_is_enabled]
)
В ответ выдает:
c_root = c.get('root').strip()
AttributeError: 'str' object has no attribute 'get'
Ответ json (acc_response) из себя представляет словарь.
upd: для уточнения прикреплю часть запроса, из которого запрашиваются данные
requestDomainAcc =
{
"controller": "BatchProcessing",
"session": token_session,
"query": {
"items": [
{
"name": "AccountTree",
"controller": "account_tree",
"params": {
"name_filter": {
"name": ""
}
}
}
]
}
}
res ответ:
{
"AccountTree": {
"root": {
"items": [
{
"domain_id": 1,
"name": "int.mum.com",
"last_sync_time": 0,
"is_sync_struct": 1,
"organization_units": "",
"auth_exist": 0,
"items": [
{
"account_id": 1,
"is_master": 1,
"login": "v.shkysh",
"display_name": "Шукшин Серега",
"last_activity_utc_time": 1661259936,
"employee": {
"employee_id": 2,
"display_name": "Шукшин Серега"
},
"is_single_link": 1
}
]
},
{
"domain_id": 2,
"name": "vl.contoso.com",
"last_sync_time": 0,
"is_sync_struct": 0,
"organization_units": "",
"auth_exist": 0,
"items": [
{
"account_id": 5,
"is_master": 1,
"login": "Administrator",
"display_name": "Administrator",
"last_activity_utc_time": 1661257338,
"employee": {
"employee_id": 6,
"display_name": "Administrator"
},
"is_single_link": 1
},
Ответы (1 шт):
Автор решения: Namerek
→ Ссылка
pip install jmespath
data = {
"AccountTree": {
"root": {
"items": [
{
"domain_id": 1,
"name": "int.mum.com",
"last_sync_time": 0,
"is_sync_struct": 1,
"organization_units": "",
"auth_exist": 0,
"items": [
{
"account_id": 1,
"is_master": 1,
"login": "v.shkysh",
"display_name": "Шукшин Серега",
"last_activity_utc_time": 1661259936,
"employee": {
"employee_id": 2,
"display_name": "Шукшин Серега"
},
"is_single_link": 1
}
]
},
{
"domain_id": 2,
"name": "vl.contoso.com",
"last_sync_time": 0,
"is_sync_struct": 0,
"organization_units": "",
"auth_exist": 0,
"items": [
{
"account_id": 5,
"is_master": 1,
"login": "Administrator",
"display_name": "Administrator",
"last_activity_utc_time": 1661257338,
"employee": {
"employee_id": 6,
"display_name": "Administrator"
},
"is_single_link": 1
},
{
"account_id": 6,
"is_master": 1,
"login": "Administrator",
"display_name": "Administrator",
"last_activity_utc_time": 1661257558,
"employee": {
"employee_id": 8,
"display_name": "Administrator"
},
"is_single_link": 1
}
]
}
]
}
}
}
import jmespath as jp
print(
jp.search(
'AccountTree.root.items[*].items[*][employee.employee_id,employee.display_name,login,last_activity_utc_time,is_single_link][]',
data
)
)
# [[2, 'Шукшин Серега', 'v.shkysh', 1661259936, 1], [6, 'Administrator', 'Administrator', 1661257338, 1], [8, 'Administrator', 'Administrator', 1661257558, 1]]
UPD:
Если использовать другой паттерн то можно на выходе получить список словарей:
pprint(
jp.search(
'AccountTree.root.items[*].items[*].{employee_id:employee.employee_id,display_name:employee.display_name,login:login,last_activity_utc_time:last_activity_utc_time,is_single_link:is_single_link}[]',
data
)
)
Даст на выходе
[{'display_name': 'Шукшин Серега',
'employee_id': 2,
'is_single_link': 1,
'last_activity_utc_time': 1661259936,
'login': 'v.shkysh'},
{'display_name': 'Administrator',
'employee_id': 6,
'is_single_link': 1,
'last_activity_utc_time': 1661257338,
'login': 'Administrator'},
{'display_name': 'Administrator',
'employee_id': 8,
'is_single_link': 1,
'last_activity_utc_time': 1661257558,
'login': 'Administrator'}]
А за ошибку Вам в коментариях правильно ответили, при итерации по словарю, в переменную попадает значение ключа. Для того, чтобы итерировать по ключам и значениям, то итерацию нужно делать по
for key, value in var.items():