REST API, который я вызываю, возвращает несколько объектов в одном ответе JSON. Используя Python 2.7, я пытаюсь проанализировать этот ответ, чтобы распечатать некоторые из этих значений для ВСЕХ объектов в ответе.
Как лучше всего извлечь эти данные из объектов все, указанных в ответе REST API?
Мне нужен список, который включает «ключ», «имя» и «адрес электронной почты» для каждого объекта в ответе JSON.
Вот как я сделал это для отдельных объектов в ответе:
>>>> a = json.loads(response)
>>> print a.get(key), ";", a.get('name'), ";", a.get('emailAddress')
keyOne ; nameOne ; mailOne
Для нескольких объектов я бы хотел, чтобы каждый объект имел ключ, имя, адрес электронной почты, отображаемый в новой строке.
Данные ответа структурированы следующим образом:
[
{
"self": "https://example1.com",
"key": "keyOne",
"name": "nameOne",
"emailAddress": "mailOne",
"avatarUrls": {
"48x48": "https://test.com/secure/useravatar?avatarId=1",
"24x24": "https://test.com/secure/useravatar?size=small&avatarId=1",
"16x16": "https://test.com/secure/useravatar?size=xsmall&avatarId=1",
"32x32": "https://test.com/secure/useravatar?size=medium&avatarId=1"
},
"displayName": "displayNameOne",
"active": true,
"timeZone": "Europe",
"locale": "en_UK"
},
{
"self": "https://example2.com",
"key": "keyTwo",
"name": "nameTwo",
"emailAddress": "mailTwo",
"avatarUrls": {
"48x48": "https://test.com/secure/useravatar?avatarId=2",
"24x24": "https://test.com/secure/useravatar?size=small&avatarId=2",
"16x16": "https://test.com/secure/useravatar?size=xsmall&avatarId=2",
"32x32": "https://test.com/secure/useravatar?size=medium&avatarId=2"
},
"displayName": "displayNameTwo",
"active": false,
"timeZone": "Europe",
"locale": "en_US"
}
]
Переберите список ответов, чтобы получить значения нужных ключей:
j_res = [
{
"self": "https://example1.com",
# rest of the response here
"timeZone": "Europe",
"locale": "en_US"
}
]
for elem in j_res:
print(elem.get('key', "Key does not exist"), elem.get('name', 'Name does not exist'), elem.get('emailAddress', 'emailAddress does not exist'))
ВЫХОД:
keyOne nameOne mailOne
keyTwo nameTwo mailTwo
РЕДАКТИРОВАТЬ:
Если вы хотите, чтобы они были в списке кортежей:
print([(elem.get('key', None), elem.get('name', None), elem.get('emailAddress', None)) for elem in j_res])
ВЫХОД:
[('keyOne', 'nameOne', 'mailOne'), ('keyTwo', 'nameTwo', 'mailTwo')]
РЕДАКТИРОВАТЬ 2:
Поскольку ответ возвращает логическое значение (true
/false
) вместо строки, обходной путь для этого может состоять в том, чтобы преобразовать ответ в строку, а затем заменить недопустимые логические значения строкой, а затем выполнить итерацию по списку:
j_res = '''[
{
"self": "https://example1.com",
"key": "keyOne",
"name": "nameOne",
"emailAddress": "mailOne",
"avatarUrls": {
"48x48": "https://test.com/secure/useravatar?avatarId=1",
"24x24": "https://test.com/secure/useravatar?size=small&avatarId=1",
"16x16": "https://test.com/secure/useravatar?size=xsmall&avatarId=1",
"32x32": "https://test.com/secure/useravatar?size=medium&avatarId=1"
},
"displayName": "displayNameOne",
"active": true, # notice this
"timeZone": "Europe",
"locale": "en_UK"
},
{
"self": "https://example2.com",
"key": "keyTwo",
"name": "nameTwo",
"emailAddress": "mailTwo",
"avatarUrls": {
"48x48": "https://test.com/secure/useravatar?avatarId=2",
"24x24": "https://test.com/secure/useravatar?size=small&avatarId=2",
"16x16": "https://test.com/secure/useravatar?size=xsmall&avatarId=2",
"32x32": "https://test.com/secure/useravatar?size=medium&avatarId=2"
},
"displayName": "displayNameTwo",
"active": false, # notice this
"timeZone": "Europe",
"locale": "en_US"
}
]'''
from ast import literal_eval
res = literal_eval(j_res.replace("true","'true'").replace("false", "'false'"))
print([(elem.get('key', None), elem.get('name', None), elem.get('emailAddress', None)) for elem in res])
ВЫХОД:
[('keyOne', 'nameOne', 'mailOne'), ('keyTwo', 'nameTwo', 'mailTwo')]
Ответ получен через GET-запрос к API непосредственно из скрипта Python. Я проверил документацию API, и по умолчанию это логическое значение.
@Falco не беспокойтесь, просто преобразуйте ответ в строку, а затем следуйте тому, что я показал во втором редактировании!
Один вопрос: нужно ли мне вручную добавлять "" для каждого нового объекта в ответе JSON?
@Falco Нет, просто преобразуй полученный ответ в str
Ответ представляет собой просто массив объектов. Вам нужно перебрать этот массив и распечатать ключи, которые вы печатаете для одного объекта.
resp = ...
for a in resp:
print a.get(key), ";", a.get('name'), ";", a.get('emailAddress')
Ключ для «Активно» возвращает логическое значение вместо строки. Это приводит к
NameError: name 'true' is not defined
. Есть ли простой способ исправить эту ошибку без ручной корректировки данных?