Conversion de la chaîne JSON en dictionnaire non répertorié

215

J'essaie de transmettre un fichier JSON et de convertir les données en 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 json1_dataà être un dicttype, mais il apparaît en fait comme un listtype lorsque je le vérifie type(json1_data).

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

Lawchit
la source
3
Pouvez-vous nous montrer un exemple de votre fichier JSON?
Mac
J'essaie d'accéder à la clé '
datapoints
4
Votre élément de base est une liste. essayez json1_data[0]['datapoints'].
gddc
à une supposition, je dirais que votre json est une liste et non un dictionnaire
Joran Beasley
1
D'après ce que notre instructeur nous a montré, lorsqu'il a tapé (json1_data), il est apparu comme un type «dict». Merci pour l'aide à tous!
Lawchit

Réponses:

277

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]

Vous pouvez désormais accéder aux données stockées dans des points de données exactement comme vous vous y attendiez:

datapoints = json1_data['datapoints']

J'ai une autre question si quelqu'un peut mordre: j'essaie de prendre la moyenne des premiers éléments de ces points de données (c'est-à-dire les points de données [0] [0]). Juste pour les énumérer, j'ai essayé de faire des points de données [0: 5] [0] mais tout ce que j'obtiens est le premier point de données avec les deux éléments au lieu de vouloir obtenir les 5 premiers points de données 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 uniquement les 5 premiers éléments, puis l'ajout [0]à la fin de celui-ci ne prendra que 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 la liste :

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

Voici un moyen simple de calculer la moyenne:

sum(p[0] for p in datapoints[0:5])/5. # Result is 35.8

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

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 is now 35.8

L'utilisation de l' ,opérateur avec la syntaxe de découpage pour les tableaux de NumPy a le comportement que vous attendiez à l'origine avec les découpages de liste.

DaoWen
la source
Merci pour ça! J'ai une autre question si quelqu'un peut mordre: j'essaie de prendre la moyenne des premiers éléments de ces points de données (c'est-à-dire les points de données [0] [0]). Juste pour les énumérer, j'ai essayé de faire des points de données [0: 5] [0] mais tout ce que j'obtiens est le premier point de données avec les deux éléments au lieu de vouloir obtenir les 5 premiers points de données contenant uniquement le premier élément. Y a-t-il un moyen de faire cela?
Lawchit
2
@lawchit - Voir ma réponse mise à jour. Si vous allez faire des calculs avec ces données, je vous recommande fortement d'utiliser NumPy.
DaoWen
Celui-ci mérite 100 autres points :-) Je cherchais cette solution depuis 1 journée complète
Mamun
16

Voici un simple extrait qui se lit dans un jsonfichier texte à 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 guillemets simples.

Votre fichier JSON dump.txt:

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

Script Python:

import json
with open('/your/path/to/a/dict/dump.txt') as handle:
    dictdump = json.loads(handle.read())
user1767754
la source
8

Vous pouvez utiliser les éléments suivants:

import json

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

 # Now you can use it like dictionary
 # For example:

 print(json_dict["username"])
userguest
la source
3

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

Vous trouverez ci-dessous l'exemple d'extrait qui peut être utilisé.

import json
f = open("data.json")
data = json.load(f))
f.close()
type(data)
print(data[<keyFromTheJsonFile>])
Sampat Kumar
la source
la commande «open» ferme-t-elle automatiquement le fichier json dans ce cas? J'ai remarqué que vous n'utilisez pas de gestionnaire de contexte.
Moondra
1
@Moondra U doit utiliser le close () pour fermer les fichiers
Sampat Kumar
2
@Moondra vous pouvez également utiliser l' with()opérateur au lieu d'avoir à ouvrir et fermer le fichier Sur le site: with open("welcome.txt") as file: Voir: pythonforbeginners.com/files/with-statement-in-python
Aceofspadez44
0

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

J'extrais des données 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 immédiatement aux clés de dictionnaire imbriquées, comme ceci:

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

où datapoint_1 se trouve dans le dictionnaire des points de données.

jeppoo1
la source
-1

passer les données en utilisant javascript ajax à partir des méthodes get

    **//javascript function    
    function addnewcustomer(){ 
    //This function run when button click
    //get the value from input box using getElementById
            var new_cust_name = document.getElementById("new_customer").value;
            var new_cust_cont = document.getElementById("new_contact_number").value;
            var new_cust_email = document.getElementById("new_email").value;
            var new_cust_gender = document.getElementById("new_gender").value;
            var new_cust_cityname = document.getElementById("new_cityname").value;
            var new_cust_pincode = document.getElementById("new_pincode").value;
            var new_cust_state = document.getElementById("new_state").value;
            var new_cust_contry = document.getElementById("new_contry").value;
    //create json or if we know python that is call dictionary.        
    var data = {"cust_name":new_cust_name, "cust_cont":new_cust_cont, "cust_email":new_cust_email, "cust_gender":new_cust_gender, "cust_cityname":new_cust_cityname, "cust_pincode":new_cust_pincode, "cust_state":new_cust_state, "cust_contry":new_cust_contry};
    //apply stringfy method on json
            data = JSON.stringify(data);
    //insert data into database using javascript ajax
            var send_data = new XMLHttpRequest();
            send_data.open("GET", "http://localhost:8000/invoice_system/addnewcustomer/?customerinfo="+data,true);
            send_data.send();

            send_data.onreadystatechange = function(){
              if(send_data.readyState==4 && send_data.status==200){
                alert(send_data.responseText);
              }
            }
          }

vues django

    def addNewCustomer(request):
    #if method is get then condition is true and controller check the further line
        if request.method == "GET":
    #this line catch the json from the javascript ajax.
            cust_info = request.GET.get("customerinfo")
    #fill the value in variable which is coming from ajax.
    #it is a json so first we will get the value from using json.loads method.
    #cust_name is a key which is pass by javascript json. 
    #as we know json is a key value pair. the cust_name is a key which pass by javascript json
            cust_name = json.loads(cust_info)['cust_name']
            cust_cont = json.loads(cust_info)['cust_cont']
            cust_email = json.loads(cust_info)['cust_email']
            cust_gender = json.loads(cust_info)['cust_gender']
            cust_cityname = json.loads(cust_info)['cust_cityname']
            cust_pincode = json.loads(cust_info)['cust_pincode']
            cust_state = json.loads(cust_info)['cust_state']
            cust_contry = json.loads(cust_info)['cust_contry']
    #it print the value of cust_name variable on server
            print(cust_name)
            print(cust_cont)
            print(cust_email)
            print(cust_gender)
            print(cust_cityname)
            print(cust_pincode)
            print(cust_state)
            print(cust_contry)
            return HttpResponse("Yes I am reach here.")**
Mohit Mishra
la source
2
est-ce une réponse à la question?
Siong Thye Goh