Konwertowanie ciągu JSON na słownik nie jest wyświetlany

215

Próbuję przekazać plik JSON i przekonwertować dane do słownika.

Do tej pory zrobiłem to:

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

Spodziewam json1_datasię, że będę dicttypem, ale tak naprawdę wyłania się jako listtyp, kiedy to sprawdzam type(json1_data).

czego mi brakuje? Potrzebuję tego jako słownika, aby uzyskać dostęp do jednego z klawiszy.

akt prawny
źródło
3
Czy możesz nam pokazać przykład swojego pliku JSON?
Mac
Próbuję uzyskać dostęp do klucza „datapoints” graphite.sdsc.edu:8443/render/…
lawchit,
4
Twój podstawowy element to lista. spróbuj json1_data[0]['datapoints'].
gddc,
zgaduję, że powiedziałbym, że twój json nie jest słownikiem
Joran Beasley
1
Z tego, co pokazał nam nasz instruktor, kiedy napisał (json1_data), jego pojawił się jako typ „dict”. Dziękuję wszystkim za pomoc!
lawchit

Odpowiedzi:

277

Twój JSON jest tablicą z jednym obiektem w środku, więc kiedy go czytasz, dostajesz listę ze słownikiem w środku. Dostęp do słownika można uzyskać, uzyskując dostęp do pozycji 0 na liście, jak pokazano poniżej:

json1_data = json.loads(json1_str)[0]

Teraz możesz uzyskać dostęp do danych przechowywanych w punktach danych, tak jak się spodziewałeś:

datapoints = json1_data['datapoints']

Mam jeszcze jedno pytanie, czy ktoś może gryźć: staram się wziąć średnią pierwszych elementów z tych punktów danych (tj. Punktów danych [0] [0]). Aby je wymienić, próbowałem zrobić punkty danych [0: 5] [0], ale dostaję tylko pierwszy punkt danych z oboma elementami, w przeciwieństwie do chęci otrzymania pierwszych 5 punktów danych zawierających tylko pierwszy element. Czy jest na to sposób?

datapoints[0:5][0]nie robi tego, czego oczekujesz. datapoints[0:5]zwraca nowy wycinek listy zawierający tylko 5 pierwszych elementów, a następnie dodanie [0]na końcu zajmie tylko pierwszy element z wynikowego wycinka listy . To, czego potrzebujesz, aby uzyskać pożądany wynik, to zrozumienie listy :

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

Oto prosty sposób obliczenia średniej:

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

Jeśli chcesz zainstalować NumPy , jest to jeszcze łatwiejsze:

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

Używanie ,operatora ze składnią wycinania dla tablic NumPy ma takie zachowanie, jakiego pierwotnie oczekiwałeś przy wycinkach listy.

DaoWen
źródło
Dziękuję Ci za to! Mam jeszcze jedno pytanie, czy ktoś może gryźć: staram się wziąć średnią pierwszych elementów z tych punktów danych (tj. Punktów danych [0] [0]). Aby je wymienić, próbowałem zrobić punkty danych [0: 5] [0], ale dostaję tylko pierwszy punkt danych z oboma elementami, w przeciwieństwie do chęci otrzymania pierwszych 5 punktów danych zawierających tylko pierwszy element. Czy jest na to sposób?
lawchit
2
@lawchit - Zobacz moją zaktualizowaną odpowiedź. Jeśli zamierzasz robić matematykę z tymi danymi, zdecydowanie polecam korzystanie z NumPy.
DaoWen
Ten zasługuje na kolejne 100 punktów :-) Szukałem tego rozwiązania przez 1 cały dzień
Mamun
16

Oto prosty fragment, który czyta się w jsonpliku tekstowym ze słownika. Zauważ, że plik json musi być zgodny ze standardem json, więc musi zawierać "podwójne cudzysłowy, a nie 'pojedyncze cudzysłowy.

Twój plik JSON dump.txt:

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

Skrypt Pythona:

import json
with open('/your/path/to/a/dict/dump.txt') as handle:
    dictdump = json.loads(handle.read())
użytkownik1767754
źródło
8

Możesz użyć następujących opcji:

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
źródło
3

Najlepszym sposobem na załadowanie danych JSON do słownika jest użycie wbudowanego modułu ładującego json.

Poniżej znajduje się przykładowy fragment kodu, którego można użyć.

import json
f = open("data.json")
data = json.load(f))
f.close()
type(data)
print(data[<keyFromTheJsonFile>])
Sampat Kumar
źródło
czy w tym przypadku polecenie „otwórz” automatycznie zamyka plik json? Zauważyłem, że nie używasz menedżera kontekstu.
Moondra
1
@Moondra U musisz użyć close (), aby zamknąć pliki
Sampat Kumar
2
@Moondra można również użyć with()operatora zamiast otwierania i zamykania pliku Ze strony: with open("welcome.txt") as file: Patrz: pythonforbeginners.com/files/with-statement-in-python
Aceofspadez44
0

Pracuję z kodem Python dla interfejsu API REST, więc jest on przeznaczony dla tych, którzy pracują nad podobnymi projektami.

Wyodrębniam dane z adresu URL za pomocą żądania POST, a nieprzetworzony wynik to JSON. Z jakiegoś powodu wynik jest już słownikiem, a nie listą, i od razu mogę odwoływać się do zagnieżdżonych kluczy słownika:

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

gdzie datapoint_1 znajduje się w słowniku punktów danych.

jeppoo1
źródło
-1

przekazać dane za pomocą javascript ajax z metod 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);
              }
            }
          }

widoki 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
źródło
2
czy to odpowiedź na pytanie?
Siong Thye Goh