296 votes

Convertir une chaîne JSON en dictionnaire et non en liste

Je cherche à passer un fichier JSON et convertir les données en un dictionnaire.

Jusqu'à présent, voici ce que j'ai fait :

import json
json1_file = open('json1')
json1_str = json1_file.read()
json1_data = json.loads(json1_str)

Je m'attends à ce que json1_data soit de type dict mais en réalité il est de type list lorsque je le vérifie avec type(json1_data).

Qu'est-ce que j'ai manqué ? J'ai besoin que ce soit un dictionnaire pour accéder à l'une des clés.

359voto

DaoWen Points 14480

Votre JSON est un tableau avec un seul objet à l'intérieur, donc lorsque vous le lisez, vous obtenez une liste avec un dictionnaire à l'intérieur. Vous pouvez accéder à votre dictionnaire en accédant à l'élément 0 de la liste, comme indiqué ci-dessous :

json1_data = json.loads(json1_str)[0]

Maintenant, vous pouvez accéder aux données stockées dans datapoints comme vous le souhaitiez:

datapoints = json1_data['datapoints']

J'ai une autre question si quelqu'un peut mordre : J'essaie de calculer la moyenne des premiers éléments de ces datapoints(c'est-à-dire datapoints[0][0]). Juste pour les lister, j'ai essayé de faire datapoints[0:5][0] mais tout ce que j'obtiens est le premier datapoint avec les deux éléments au lieu de vouloir obtenir les 5 premiers datapoints contenant uniquement le premier élément. Y a-t-il un moyen de faire cela ?

datapoints[0:5][0] ne fait pas ce que vous attendez. datapoints[0:5] renvoie une nouvelle tranche de liste contenant simplement les 5 premiers éléments, et en ajoutant [0] à la fin cela prendra simplement le premier élément de cette tranche de liste résultante. Ce que vous devez utiliser pour obtenir le résultat souhaité est une compréhension de liste:

[p[0] for p in datapoints[0:5]]

Voici une manière simple de calculer la moyenne :

sum(p[0] for p in datapoints[0:5])/5. # Le résultat est 35.8

Si vous êtes prêt à installer NumPy, alors c'est encore plus facile :

import numpy
json1_file = open('json1')
json1_str = json1_file.read()
json1_data = json.loads(json1_str)[0]
datapoints = numpy.array(json1_data['datapoints'])
avg = datapoints[0:5,0].mean()
# avg est maintenant 35.8

Utiliser l'opérateur , avec la syntaxe de découpage des tableaux de NumPy a le comportement que vous attendiez initialement avec les tranches de liste.

29voto

user1767754 Points 460

Voici un simple extrait qui lit un fichier texte json à partir d'un dictionnaire. Notez que votre fichier json doit suivre la norme json, il doit donc avoir des guillemets doubles " plutôt que des simples guillemets '.

Votre fichier JSON dump.txt :

{"test":"1", "test2":123}

Script Python :

import json
with open('/votre/chemin/vers/un/dump/de/dictionnaire.txt') as handle:
    dictdump = json.loads(handle.read())

18voto

userguest Points 181

Vous pouvez utiliser ce qui suit :

import json

 with open('.json', 'r') as JSON:
       json_dict = json.load(JSON)

 # Maintenant vous pouvez l'utiliser comme un dictionnaire
 # Par exemple:

 print(json_dict["username"])

3voto

Sampat Kumar Points 124

La meilleure façon de charger des données JSON dans un dictionnaire est d'utiliser le chargeur json intégré.

Voici un extrait d'exemple qui peut être utilisé.

import json
f = open("data.json")
data = json.load(f))
f.close()
type(data)
print(data[])

1voto

jeppoo1 Points 422

Je travaille avec un code Python pour une API REST, donc ceci est pour ceux qui travaillent sur des projets similaires.

J'extrais des données à partir d'une URL en utilisant une requête POST et la sortie brute est JSON. Pour une raison quelconque, la sortie est déjà un dictionnaire, pas une liste, et je peux me référer directement aux clés du dictionnaire imbriqué, comme ceci :

datapoint_1 = json1_data['datapoints']['datapoint_1']

où datapoint_1 se trouve à l'intérieur du dictionnaire datapoints.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X