Mengubah String JSON ke Kamus Tidak Daftar


214

Saya mencoba mengirimkan file JSON dan mengonversi data menjadi kamus.

Sejauh ini, inilah yang telah saya lakukan:

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

Saya berharap json1_datauntuk menjadi dicttipe tetapi sebenarnya keluar sebagai listtipe ketika saya memeriksanya type(json1_data).

Apa yang saya lewatkan? Saya ingin ini menjadi kamus sehingga saya dapat mengakses salah satu kunci.


3
Bisakah Anda menunjukkan kepada kami contoh file JSON Anda?
Mac

Saya mencoba mengakses kunci 'datapoints' graphite.sdsc.edu:8443/render/…
lawchit

4
Item dasar Anda adalah daftar. coba json1_data[0]['datapoints'].
gddc

pada tebakan saya akan mengatakan json Anda adalah daftar bukan kamus
Joran Beasley

1
Dari apa yang ditunjukkan instruktur kami kepada kami, ketika ia mengetik (json1_data), ia muncul sebagai tipe 'dict'. Terima kasih atas bantuan semuanya!
lawchit

Jawaban:


276

JSON Anda adalah larik dengan satu objek di dalamnya, jadi ketika Anda membacanya, Anda mendapatkan daftar dengan kamus di dalamnya. Anda dapat mengakses kamus Anda dengan mengakses item 0 dalam daftar, seperti yang ditunjukkan di bawah ini:

json1_data = json.loads(json1_str)[0]

Sekarang Anda dapat mengakses data yang disimpan dalam datapoints seperti yang Anda harapkan:

datapoints = json1_data['datapoints']

Saya punya satu pertanyaan lagi jika ada yang bisa menggigit: Saya mencoba mengambil rata-rata elemen pertama dalam datapoints ini (yaitu datapoints [0] [0]). Hanya untuk daftar mereka, saya mencoba melakukan datapoints [0: 5] [0] tetapi yang saya dapatkan adalah datapoint pertama dengan kedua elemen yang bertentangan dengan keinginan untuk mendapatkan 5 datapoints pertama yang hanya berisi elemen pertama. Apakah ada cara untuk melakukan ini?

datapoints[0:5][0]tidak melakukan apa yang Anda harapkan. datapoints[0:5]mengembalikan potongan daftar baru yang hanya berisi 5 elemen pertama, dan kemudian menambahkannya [0]akan mengambil elemen pertama dari potongan daftar yang dihasilkan . Apa yang perlu Anda gunakan untuk mendapatkan hasil yang Anda inginkan adalah pemahaman daftar :

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

Berikut cara sederhana untuk menghitung rata-rata:

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

Jika Anda ingin menginstal NumPy , maka itu bahkan lebih mudah:

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

Menggunakan ,operator dengan sintaks slicing untuk array NumPy memiliki perilaku yang semula Anda harapkan dengan slice daftar.


Terima kasih untuk ini! Saya punya satu pertanyaan lagi jika ada yang bisa menggigit: Saya mencoba mengambil rata-rata elemen pertama dalam datapoints ini (yaitu datapoints [0] [0]). Hanya untuk daftar mereka, saya mencoba melakukan datapoints [0: 5] [0] tetapi semua yang saya dapatkan adalah datapoint pertama dengan kedua elemen yang bertentangan dengan keinginan untuk mendapatkan 5 datapoints pertama yang hanya berisi elemen pertama. Apakah ada cara untuk melakukan ini?
lawchit

2
@lawchit - Lihat jawaban saya yang diperbarui. Jika Anda akan melakukan matematika dengan data ini, saya sangat merekomendasikan menggunakan NumPy.
DaoWen

Yang ini layak mendapat 100 poin lagi :-) Saya telah mencari solusi ini selama 1 hari penuh
Mamun

16

Berikut ini cuplikan singkat yang dibaca dalam jsonfile teks dari kamus. Perhatikan bahwa file json Anda harus mengikuti standar json, sehingga harus memiliki "tanda kutip ganda daripada 'tanda kutip tunggal.

File JSON dump.txt Anda:

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

Skrip Python:

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

8

Anda dapat menggunakan yang berikut ini:

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

Cara terbaik untuk Muat Data JSON ke dalam Kamus adalah Anda dapat menggunakan pemuat json inbuilt.

Berikut cuplikan sampel yang dapat digunakan.

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

apakah perintah 'buka' secara otomatis menutup file json dalam kasus ini? Saya perhatikan Anda tidak menggunakan manajer konteks.
Moondra

1
@Moondra U harus menggunakan tutup () untuk menutup file
Sampat Kumar

2
@Moondra Anda juga dapat menggunakan with()operator alih-alih harus membuka dan menutup file Dari situs: with open("welcome.txt") as file: Lihat: pythonforbeginners.com/files/with-statement-in-python
Aceofspadez44

0

Saya bekerja dengan kode Python untuk API REST, jadi ini adalah untuk mereka yang bekerja pada proyek serupa.

Saya mengekstrak data dari URL menggunakan permintaan POST dan output mentahnya adalah JSON. Untuk beberapa alasan, outputnya sudah berupa kamus, bukan daftar, dan saya dapat merujuk langsung ke kunci kamus bersarang, seperti ini:

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

di mana datapoint_1 ada di dalam kamus datapoints.


-1

lulus data menggunakan javascript ajax dari metode 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);
              }
            }
          }

tampilan 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
apakah ini jawaban untuk pertanyaan?
Siong Thye Goh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.