Conversione della stringa JSON in elenco non dizionario


215

Sto cercando di passare un file JSON e convertire i dati in un dizionario.

Finora, questo è quello che ho fatto:

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

Mi aspetto json1_datadi essere un dicttipo, ma in realtà viene fuori come un listtipo quando lo controllo type(json1_data).

Cosa mi sto perdendo? Ho bisogno che questo sia un dizionario in modo da poter accedere a una delle chiavi.


3
Puoi mostrarci un esempio del tuo file JSON?
Mac,

Sto cercando di accedere alla chiave "
datapoints

4
L'articolo di base è un elenco. provare json1_data[0]['datapoints'].
gddc,

a indovinare direi che il tuo JSON è un elenco non un dizionario
Joran Beasley,

1
Da ciò che il nostro istruttore ci ha mostrato, quando ha digitato (json1_data) il suo è venuto fuori come un tipo 'dict'. Grazie per l'aiuto a tutti!
lawchit,

Risposte:


277

Il tuo JSON è un array con un singolo oggetto all'interno, quindi quando lo leggi all'interno ottieni un elenco con un dizionario all'interno. Puoi accedere al tuo dizionario accedendo all'elemento 0 nell'elenco, come mostrato di seguito:

json1_data = json.loads(json1_str)[0]

Ora puoi accedere ai dati memorizzati nei punti dati esattamente come ti aspettavi:

datapoints = json1_data['datapoints']

Ho un'altra domanda se qualcuno può mordere: sto cercando di prendere la media dei primi elementi in questi punti dati (ovvero punti dati [0] [0]). Solo per elencarli, ho provato a fare datapoints [0: 5] [0] ma tutto quello che ottengo è il primo datapoint con entrambi gli elementi invece di voler ottenere i primi 5 datapoint contenenti solo il primo elemento. C'è un modo per fare questo?

datapoints[0:5][0]non fa quello che ti aspetti. datapoints[0:5]restituisce una nuova sezione di elenco contenente solo i primi 5 elementi, quindi aggiungendo [0]alla fine di esso verrà utilizzato solo il primo elemento di quella sezione di elenco risultante . Quello che devi usare per ottenere il risultato che vuoi è una comprensione della lista :

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

Ecco un modo semplice per calcolare la media:

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

Se sei disposto a installare NumPy , allora è ancora più semplice:

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'uso ,dell'operatore con la sintassi di suddivisione per gli array di NumPy ha il comportamento che ti aspettavi inizialmente con le sezioni di elenco.


Grazie per questo! Ho un'altra domanda se qualcuno può mordere: sto cercando di prendere la media dei primi elementi in questi punti dati (ovvero punti dati [0] [0]). Solo per elencarli, ho provato a fare datapoints [0: 5] [0] ma tutto quello che ottengo è il primo datapoint con entrambi gli elementi invece di voler ottenere i primi 5 datapoint contenenti solo il primo elemento. C'è un modo per fare questo?
Lawchit,

2
@lawchit - Vedi la mia risposta aggiornata. Se hai intenzione di fare matematica con questi dati, ti consiglio vivamente di usare NumPy.
DaoWen,

Questo merita altri 100 punti :-) Ho cercato questa soluzione per 1 giorno intero
Mamun

16

Ecco un semplice frammento che legge in un jsonfile di testo da un dizionario. Nota che il tuo file json deve seguire lo standard json, quindi deve avere "virgolette doppie piuttosto che 'virgolette singole.

Il tuo file dump.txt JSON:

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

Script Python:

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

8

È possibile utilizzare quanto segue:

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

3

Il modo migliore per caricare i dati JSON nel dizionario è È possibile utilizzare il caricatore json integrato.

Di seguito è riportato il frammento di esempio che può essere utilizzato.

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

il comando 'apri' chiude automaticamente il file json in questo caso? Ho notato che non stai utilizzando un gestore di contesto.
Moondra,

1
@Moondra U deve usare close () per chiudere i file
Sampat Kumar

2
@Moondra potresti anche usare l' with()operatore invece di dover aprire e chiudere il file Dal sito: with open("welcome.txt") as file: vedi: pythonforbeginners.com/files/with-statement-in-python
Aceofspadez44

0

Sto lavorando con un codice Python per un'API REST, quindi questo è per coloro che stanno lavorando su progetti simili.

Estraggo i dati da un URL utilizzando una richiesta POST e l'output non elaborato è JSON. Per qualche motivo l'output è già un dizionario, non un elenco e sono in grado di fare subito riferimento alle chiavi del dizionario nidificato, in questo modo:

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

dove datapoint_1 è all'interno del dizionario dei punti dati.


-1

passare i dati utilizzando javascript ajax dai metodi 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);
              }
            }
          }

viste 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.")**

2
è una risposta alla domanda?
Siong Thye Goh,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.