Как разобрать ответ JSON, который включает несколько объектов

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"
  }
]
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
682
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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')]

Ключ для «Активно» возвращает логическое значение вместо строки. Это приводит к NameError: name 'true' is not defined. Есть ли простой способ исправить эту ошибку без ручной корректировки данных?

Falco 08.04.2019 16:45

Ответ получен через GET-запрос к API непосредственно из скрипта Python. Я проверил документацию API, и по умолчанию это логическое значение.

Falco 08.04.2019 16:58

@Falco не беспокойтесь, просто преобразуйте ответ в строку, а затем следуйте тому, что я показал во втором редактировании!

DirtyBit 08.04.2019 16:59

Один вопрос: нужно ли мне вручную добавлять "" для каждого нового объекта в ответе JSON?

Falco 10.04.2019 15:08

@Falco Нет, просто преобразуй полученный ответ в str

DirtyBit 10.04.2019 15:11

Ответ представляет собой просто массив объектов. Вам нужно перебрать этот массив и распечатать ключи, которые вы печатаете для одного объекта.

resp = ...
for a in resp:
    print a.get(key), ";", a.get('name'), ";", a.get('emailAddress')

Другие вопросы по теме