Konvertieren von JSON-Zeichenfolgen in Wörterbücher ohne Liste

213

Ich versuche, eine JSON-Datei zu übergeben und die Daten in ein Wörterbuch zu konvertieren.

Bisher habe ich Folgendes getan:

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

Ich erwarte json1_data, ein dictTyp zu sein, aber er kommt tatsächlich als listTyp heraus, wenn ich ihn überprüfe type(json1_data).

Was vermisse ich? Ich brauche dies als Wörterbuch, damit ich auf einen der Schlüssel zugreifen kann.

lawchit
quelle
3
Können Sie uns ein Beispiel Ihrer JSON-Datei zeigen?
Mac
Ich versuche, auf den 'Datenpunkte'-Schlüssel graphite.sdsc.edu:8443/render/…
lawchit
4
Ihr Basisartikel ist eine Liste. versuche es json1_data[0]['datapoints'].
GDDC
Bei einer Vermutung würde ich sagen, Ihr Json ist eine Liste, kein Wörterbuch
Joran Beasley
1
Nach dem, was unser Ausbilder uns gezeigt hat, als er (json1_data) tippte, kam er als "Dikt" -Typ auf. Vielen Dank für die Hilfe an alle!
Lawchit

Antworten:

276

Ihr JSON ist ein Array mit einem einzelnen Objekt. Wenn Sie es einlesen, erhalten Sie eine Liste mit einem Wörterbuch. Sie können auf Ihr Wörterbuch zugreifen, indem Sie auf Element 0 in der Liste zugreifen, wie unten gezeigt:

json1_data = json.loads(json1_str)[0]

Jetzt können Sie wie erwartet auf die in Datenpunkten gespeicherten Daten zugreifen :

datapoints = json1_data['datapoints']

Ich habe noch eine Frage, ob jemand beißen kann: Ich versuche, den Durchschnitt der ersten Elemente in diesen Datenpunkten (dh Datenpunkte [0] [0]) zu ermitteln. Um sie aufzulisten, habe ich versucht, Datenpunkte [0: 5] [0] zu erstellen, aber alles, was ich bekomme, ist der erste Datenpunkt mit beiden Elementen, anstatt die ersten 5 Datenpunkte zu erhalten, die nur das erste Element enthalten. Gibt es eine Möglichkeit, dies zu tun?

datapoints[0:5][0]tut nicht was du erwartest. datapoints[0:5]Gibt ein neues Listen-Slice zurück, das nur die ersten 5 Elemente enthält. Wenn Sie [0]am Ende hinzufügen , wird nur das erste Element aus dem resultierenden Listen-Slice entnommen . Was Sie verwenden müssen, um das gewünschte Ergebnis zu erzielen, ist ein Listenverständnis :

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

Hier ist eine einfache Methode zur Berechnung des Mittelwerts:

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

Wenn Sie bereit sind, NumPy zu installieren , ist es noch einfacher:

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

Die Verwendung des ,Operators mit der Slicing-Syntax für NumPy-Arrays hat das Verhalten, das Sie ursprünglich mit den Listen-Slices erwartet hatten.

DaoWen
quelle
Danke dafür! Ich habe noch eine Frage, ob jemand beißen kann: Ich versuche, den Durchschnitt der ersten Elemente in diesen Datenpunkten (dh Datenpunkte [0] [0]) zu ermitteln. Um sie aufzulisten, habe ich versucht, Datenpunkte [0: 5] [0] zu erstellen, aber alles, was ich bekomme, ist der erste Datenpunkt mit beiden Elementen, anstatt die ersten 5 Datenpunkte zu erhalten, die nur das erste Element enthalten. Gibt es eine Möglichkeit, dies zu tun?
Lawchit
2
@lawchit - Siehe meine aktualisierte Antwort. Wenn Sie mit diesen Daten rechnen möchten, würde ich die Verwendung von NumPy wärmstens empfehlen.
DaoWen
Dieser verdient weitere 100 Punkte :-) Ich habe nach dieser Lösung für 1 ganzen Tag gesucht
Mamun
16

Hier ist ein einfacher Ausschnitt, der eine jsonTextdatei aus einem Wörterbuch liest . Beachten Sie, dass Ihre JSON-Datei dem JSON-Standard entsprechen muss, sodass sie "doppelte Anführungszeichen und keine 'einfachen Anführungszeichen enthalten muss.

Ihre JSON dump.txt-Datei:

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

Python-Skript:

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

Sie können Folgendes verwenden:

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
quelle
3

Der beste Weg, um JSON-Daten in das Wörterbuch zu laden, ist, den eingebauten json-Loader zu verwenden.

Unten finden Sie das Beispiel-Snippet, das verwendet werden kann.

import json
f = open("data.json")
data = json.load(f))
f.close()
type(data)
print(data[<keyFromTheJsonFile>])
Sampat Kumar
quelle
Schließt der Befehl 'open' in diesem Fall die JSON-Datei automatisch? Ich habe festgestellt, dass Sie keinen Kontextmanager verwenden.
Moondra
1
@ Moondra U müssen die Dateien mit close () schließen
Sampat Kumar
2
@Moondra Sie können auch den with()Operator verwenden, anstatt die Datei öffnen und schließen zu müssen. Von der Site: with open("welcome.txt") as file: Siehe: pythonforbeginners.com/files/with-statement-in-python
Aceofspadez44
0

Ich arbeite mit einem Python-Code für eine REST-API, daher ist dies für diejenigen, die an ähnlichen Projekten arbeiten.

Ich extrahiere Daten aus einer URL mithilfe einer POST-Anforderung und die Rohausgabe ist JSON. Aus irgendeinem Grund ist die Ausgabe bereits ein Wörterbuch, keine Liste, und ich kann sofort auf die verschachtelten Wörterbuchschlüssel verweisen, wie folgt:

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

Dabei befindet sich datapoint_1 im Datenpunktwörterbuch.

jeppoo1
quelle
-1

Übergeben Sie die Daten mit Javascript Ajax von get-Methoden

    **//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);
              }
            }
          }

Django Ansichten

    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
quelle
2
Ist das eine Antwort auf die Frage?
Siong Thye Goh