JSON Dizesini Sözlük Değil Listesine Dönüştürme


215

Bir JSON dosyasında geçmek ve bir sözlüğe veri dönüştürmek çalışıyorum.

Şimdiye kadar yaptığım şey bu:

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

Ben json1_databir dicttür olmasını bekliyorum ama aslında listben kontrol ederken bir tür olarak çıkıyor type(json1_data).

Neyi kaçırıyorum? Anahtarlardan birine erişebilmem için sözlük olması gerekiyor.


3
Bize JSON dosyanızın bir örneğini gösterebilir misiniz?
Mac

Ben 'veri noktaları' anahtar graphite.sdsc.edu:8443/render/…
lawchit

4
Temel öğeniz bir listedir. deneyin json1_data[0]['datapoints'].
gddc

bir tahmin, senin json bir sözlük değil bir liste olduğunu söyleyebilirim
Joran Beasley

1
Eğitmenimizin bize gösterdiklerinden, (json1_data) yazdığında 'dikte' türü olarak geldi. Herkese yardım ettiğiniz için teşekkürler!
lawchit

Yanıtlar:


277

JSON'unuz içinde tek bir nesne bulunan bir dizidir, bu yüzden içinde okuduğunuzda içinde bir sözlük bulunan bir liste alırsınız. Sözlüğünüze, aşağıda gösterildiği gibi listedeki 0 öğesine erişerek erişebilirsiniz:

json1_data = json.loads(json1_str)[0]

Artık saklanan verilere erişebilir datapoints Beklediğiniz gibi:

datapoints = json1_data['datapoints']

Herkes ısırırsanız bir soru daha var: Bu veri noktaları (yani veri noktaları [0] [0]) ilk unsurların ortalamasını almaya çalışıyorum. Sadece onları listelemek için veri noktaları yapmayı denedim [0: 5] [0] ama tüm aldığım sadece ilk elemanı içeren ilk 5 veri noktasını almak istemek yerine her iki elemanla da ilk veri noktası. Bunu yapmanın bir yolu var mı?

datapoints[0:5][0]beklediğinizi yapmaz. datapoints[0:5]yalnızca ilk 5 öğeyi içeren yeni bir liste dilimi döndürür ve ardından [0]sonuna ekleme , sonuçta elde edilen liste diliminden yalnızca ilk öğeyi alır . İstediğiniz sonucu elde etmek için kullanmanız gereken bir liste kavramasıdır :

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

Ortalamayı hesaplamanın basit bir yolu:

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

NumPy'yi kurmak istiyorsanız , o zaman daha da kolay:

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

Kullanılması ,numpy en diziler için dilimleme sözdizimi operatöre başlangıçta liste dilimleri ile bekliyorduk davranış vardır.


Bunun için teşekkür ederim! Herkes ısırırsanız bir soru daha var: Bu veri noktaları (yani veri noktaları [0] [0]) ilk unsurların ortalamasını almaya çalışıyorum. Sadece onları listelemek için veri noktaları yapmayı denedim [0: 5] [0] ama tüm aldığım sadece ilk elemanı içeren ilk 5 veri noktasını almak istemek yerine her iki elemanla da ilk veri noktası. Bunu yapmanın bir yolu var mı?
lawchit

2
@lawchit - Güncellenmiş cevabımı görün. Bu verilerle matematik yapacaksanız NumPy kullanmanızı şiddetle tavsiye ederim.
DaoWen

Bu bir başka 100 puan hak ediyor :-) 1 tam gün bu çözümü arıyordum
Mamun

16

İşte jsonbir sözlükten bir metin dosyasında okunan basit bir snippet . Json dosyanızın json standardını izlemesi gerektiğini unutmayın, bu nedenle tek tırnak "yerine çift 'tırnak olmalıdır.

JSON dump.txt Dosyanız:

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

Python Komut Dosyası:

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

8

Aşağıdakileri kullanabilirsiniz:

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

JSON Verilerini Sözlüğe Yüklemenin en iyi yolu, dahili json yükleyiciyi kullanabilirsiniz.

Aşağıda kullanılabilecek örnek snippet bulunmaktadır.

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

'open' komutu bu durumda json dosyasını otomatik olarak kapatır mı? Bir bağlam yöneticisi kullanmadığınızı fark ettim.
Moondra

1
@Moondra U Dosyaları kapatmak için close () kullanmak zorunda
Sampat Kumar

2
@Moondra with()dosyayı açmak ve kapatmak yerine operatörü de kullanabilirsiniz with open("welcome.txt") as file: : Siteden
Aceofspadez44 22:30 '

0

REST API için bir Python kodu ile çalışıyorum, bu yüzden bu benzer projeler üzerinde çalışanlar içindir.

Bir POST isteği kullanarak bir URL'den veri ayıklayın ve ham çıktı JSON. Herhangi bir nedenle çıktı zaten bir sözlük değil, bir sözlüktür ve iç içe sözlük tuşlarına hemen şu şekilde başvurabilirim:

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

burada datapoint_1 veri noktaları sözlüğünün içindedir.


-1

get yöntemlerinden javascript ajax kullanarak veri aktarımı

    **//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 görünümleri

    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
bu sorunun cevabı mı?
Siong Thye Goh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.