Разбор вложенного словаря json с использованием python

У меня есть следующий вложенный словарь в формате JSON. Если я хочу получить «id», «self», «name», как мне его проанализировать с помощью программы Python.

{
  "items": [
    {
      "id": "12345",
      "links": {
        "self": "https://www.google.com"
      },
      "name": "beast",
      "type": "Device"
    }
  ],
  "links": {
    "self": "https://www.google.com"
  },
  "paging": {
    "count": 1,
    "limit": 1,
    "offset": 0,
    "pages": 1
  }
}

какой я? оба из них?

Onyambu 10.08.2018 16:23

@Onyambu да. для них обоих.

I am L 10.08.2018 16:24

Не совсем тот же вопрос, но он должен указать вам правильное направление Разбор значений из файла JSON

benvc 10.08.2018 16:24
16
3
29 494
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Это помогает писать словарь с отступом, чтобы лучше видеть его вложенность:

mydict = {   
   'items': [
       {
           'id': '12345',
           'links': {'self': 'https://www.google.com'},
           'name': 'beast',
           'type': 'Device'
       }
    ],
    'links': {'self': 'https://www.google.com'},
    'paging': {
        'count': 1,
        'limit': 1,
        'offset': 0,
        'pages': 1
    }
}

Теперь вы можете извлечь то, что хотите:

If I want to get "id", "self", "name",

print(mydict['items'][0]['id'])
print(mydict['items'][0]['links']['self'])
print(mydict['links']['self'])
print(mydict['items'][0]['name'])
Ответ принят как подходящий

Чтобы понять, как настроен ваш json, его проще разбить. Давайте посмотрим на ключи первого словаря и удалим значения.

json = {"items": [], "links": {}}

У вас есть словарь с двумя ключами и двумя значениями. Все три переменные, которые вы ищете (id, self, name), находятся в первом ключе, «items». Итак, давайте погрузимся глубже.

json["items"] = [{'links': {'self': 'https://www.google.com'}, 'name': 'beast', 'type': 'Device', 'id': '12345'}]

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

json["items"][0] = {'links': {'self': 'https://www.google.com'}, 'id': '12345', 'type': 'Device', 'name': 'beast'}

Наконец, у нас есть словарь с искомыми значениями, поэтому вы можете использовать этот код для поиска имени и идентификатора.

json["items"][0]["name"] = beast

json["items"][0]["id"] = 12345

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

json["items"][0]["links"]["self"] = http://google.com

Теперь у вас есть все ваши значения, вам просто нужно просмотреть все списки и словари, чтобы получить желаемое.

Большое спасибо!

I am L 10.08.2018 16:48

Нет проблем, рад, что смог помочь

Aeolus 10.08.2018 16:50

Большое вам спасибо, в этом примере речь идет об одном элементе и одном связующем ключах. Как я могу применить это, чтобы получить все элементы и ссылки, если их больше одной?

Georgi Ivanov Dimitrov 24.07.2019 12:03

Это ТАК полезно! Спасибо!

Mamun 22.01.2020 01:53

Очень-очень полезно - то, что действительно имеет смысл!

Chris Norris 02.01.2021 04:21

Вы можете написать функцию, которая будет получать нужные вам значения:

def dict_get(x,key,here=None):
    x = x.copy()
    if here is None: here = []
    if x.get(key):  
        here.append(x.get(key))
        x.pop(key)
    else:
        for i,j in x.items():
          if  isinstance(x[i],list): dict_get(x[i][0],key,here)
          if  isinstance(x[i],dict): dict_get(x[i],key,here)
    return here

dict_get(a,'id')
 ['12345']

dict_get(a,'self')
 ['https://www.google.com', 'https://www.google.com']

dict_get(a,'name')
['beast']

Вы также можете вызвать любую клавишу, которую хотите:

данные

a = {
  "items": [
    {
      "id": "12345",
      "links": {
        "self": "https://www.google.com"
      },
      "name": "beast",
      "type": "Device"
    }
  ],
  "links": {
    "self": "https://www.google.com"
  },
  "paging": {
    "count": 1,
    "limit": 1,
    "offset": 0,
    "pages": 1
  }
}

Что такое "a" в dict_get (a, id)?

I am L 10.08.2018 20:05

Когда я вызываю функцию, я не получаю никаких результатов. Как вы получили ['' 12345 "]?

I am L 10.08.2018 20:41

@IamL просто запустите функцию еще раз, и я получу именно то, что опубликовал. Можете ли вы скопировать и вставить код еще раз?

Onyambu 10.08.2018 20:46

Ваш json в основном содержит списки внутри. Доступ к Jsons осуществляется как пары ключ-значение, а доступ к спискам осуществляется с помощью индексов.

json_object['items'][0]['id']

Приведенный выше оператор должен дать вам идентификатор. Мы получаем доступ к ключевым элементам, которые содержат список. У нас есть [0], потому что этот список содержит только один элемент (который снова является парой ключ-значение).

Тот же подход применяется к себе и имени.

json_object['links']['self']
json_object['items'][0]['links']['self']
json_object['items'][0]['name']

Разница между доступом к двум разным `` самим '' означает, что один заключен в список, поэтому нам нужно попасть в список, а другой - словарь с ключом `` я '', который находится внутри словаря `` ссылки ''

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