web-dev-qa-db-fra.com

Analyser le dictionnaire imbriqué JSON à l'aide de Python

J'ai le dictionnaire imbriqué suivant dans JSON. Si je veux obtenir "id", "self", "name", comment dois-je l'analyser en utilisant un programme 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
  }
}
8
I am L

Pour comprendre comment votre json est configuré, il est plus facile de le décomposer. Examinons les premières clés du dictionnaire et supprimons les valeurs.

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

Vous avez un dictionnaire avec deux clés et deux valeurs. Les trois variables que vous recherchez (id, self, name) se trouvent dans la première clé, "items". Plongeons donc plus profondément.

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

Vous avez maintenant une liste contenant un dictionnaire avec les valeurs que vous recherchez, nous allons donc entrer la première et la seule valeur de la liste contenant le dictionnaire suivant.

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

Enfin, nous avons le dictionnaire avec les valeurs recherchées, vous pouvez donc utiliser ce code pour trouver le nom et l'id.

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

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

La variable auto est cachée un dictionnaire plus profondément, nous devons donc fouiller dans la clé des liens.

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

Maintenant que vous avez toutes vos valeurs, il vous suffit de parcourir toutes les listes et dictionnaires pour obtenir la valeur souhaitée.

8
Aeolus

Vous pouvez écrire une fonction, qui obtiendra les valeurs dont vous avez besoin:

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

Vous pouvez également appeler n'importe quelle touche de votre choix:

les données

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
  }
}
0
Onyambu

Votre json contient essentiellement des listes à l'intérieur. Les Jsons sont accessibles sous forme de paires de valeurs clés et les listes sont accessibles à l'aide d'index.

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

La déclaration ci-dessus devrait vous donner l'id. Nous accédons aux éléments clés, qui contiennent une liste. Nous avons [0] car cette liste ne contient qu'un seul élément (qui est encore une paire de valeurs clés).

La même approche est suivie pour soi et son nom

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

La différence entre l'accès aux deux "self" différents fait que l'un est inclus dans une liste, donc nous devons entrer dans la liste et l'autre est un dictionnaire avec la clé "self" qui est à l'intérieur d'un dictionnaire "liens"

0
Harikrishna

Il permet d'écrire le dictionnaire en retrait, pour mieux visualiser son imbrication:

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
    }
}

Vous pouvez maintenant extraire ce que vous voulez:

Si je veux obtenir "id", "self", "name",

print(mydict['items'][0]['id'])
print(mydict['items'][0]['links']['self'])
print(mydict['links']['self'])
print(mydict['items'][0]['name'])
0
nosklo