การแปลงสตริง JSON เป็นรายการที่ไม่ใช้พจนานุกรม


215

ฉันพยายามส่งผ่านไฟล์ JSON และแปลงข้อมูลเป็นพจนานุกรม

จนถึงตอนนี้เป็นสิ่งที่ฉันได้ทำ:

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

ผมคาดหวังว่าjson1_dataจะเป็นdictประเภท แต่ที่จริงออกมาเป็นประเภทเมื่อตรวจสอบด้วยlisttype(json1_data)

ฉันกำลังคิดถึงอะไร ฉันต้องการสิ่งนี้เพื่อเป็นพจนานุกรมเพื่อให้ฉันสามารถเข้าถึงหนึ่งในกุญแจ


3
คุณสามารถแสดงตัวอย่างของไฟล์ JSON ของคุณให้เราทราบได้หรือไม่
Mac

ฉันกำลังพยายามเข้าถึง 'datapoints' key graphite.sdsc.edu:8443/render/…
lawchit

4
รายการฐานของคุณคือรายการ json1_data[0]['datapoints']ความพยายาม
gddc

ที่คาดเดาผมจะบอกว่า JSON ของคุณเป็นรายการไม่ได้เป็นพจนานุกรม
Joran บีสลีย์

1
จากสิ่งที่ผู้สอนของเราแสดงให้เราเห็นเมื่อเขาพิมพ์ (json1_data) เขามาเป็นประเภท 'dict' ขอบคุณสำหรับความช่วยเหลือทุกคน!
lawchit

คำตอบ:


277

JSON ของคุณเป็นอาร์เรย์ที่มีวัตถุหนึ่งชิ้นอยู่ภายในดังนั้นเมื่อคุณอ่านในนั้นคุณจะได้รับรายการที่มีพจนานุกรมอยู่ภายใน คุณสามารถเข้าถึงพจนานุกรมของคุณโดยการเข้าถึงรายการ 0 ในรายการดังที่แสดงด้านล่าง:

json1_data = json.loads(json1_str)[0]

ตอนนี้คุณสามารถเข้าถึงข้อมูลที่เก็บไว้ในดาต้าอยน์ได้อย่างที่คุณคาดไว้:

datapoints = json1_data['datapoints']

ฉันมีคำถามอีกหนึ่งข้อถ้าใครสามารถกัดได้: ฉันพยายามหาค่าเฉลี่ยขององค์ประกอบแรกในดาต้าพอยน์เหล่านี้ (เช่นดาต้าพอยน์ [0] [0]) เพียงเพื่อแสดงรายการฉันพยายามทำดาต้าพอยน์ [0: 5] [0] แต่ทั้งหมดที่ฉันได้รับคือดาต้าพอยน์แรกที่มีองค์ประกอบทั้งสองตรงข้ามกับที่ต้องการรับ 5 ดาต้าพอยน์แรกที่มีองค์ประกอบแรกเท่านั้น มีวิธีทำเช่นนี้หรือไม่?

datapoints[0:5][0]ไม่ได้ทำในสิ่งที่คุณคาดหวัง datapoints[0:5]ส่งกลับรายการชิ้นใหม่ที่มีเพียง 5 องค์ประกอบแรกแล้วเพิ่ม[0]ที่ส่วนท้ายของมันจะใช้เพียงองค์ประกอบแรกจากรายการชิ้นที่เกิดขึ้น สิ่งที่คุณต้องใช้เพื่อให้ได้ผลลัพธ์ที่คุณต้องการคือความเข้าใจในรายการ :

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

นี่เป็นวิธีง่ายๆในการคำนวณค่าเฉลี่ย:

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

หากคุณยินดีที่จะติดตั้งNumPyก็จะยิ่งง่ายขึ้น:

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

การใช้,โอเปอเรเตอร์กับไวยากรณ์ตัวแบ่งส่วนข้อมูลสำหรับอาร์เรย์ของ NumPy นั้นมีลักษณะการทำงานที่คุณคาดหวังไว้เมื่อใช้ชิ้นส่วนรายการ


ขอบคุณสำหรับสิ่งนี้! ฉันมีคำถามอีกหนึ่งข้อถ้าใครสามารถกัดได้: ฉันพยายามหาค่าเฉลี่ยขององค์ประกอบแรกในดาต้าพอยน์เหล่านี้ (เช่นดาต้าพอยน์ [0] [0]) เพียงเพื่อแสดงรายการฉันพยายามทำดาต้าพอยน์ [0: 5] [0] แต่ทั้งหมดที่ฉันได้รับคือดาต้าพอยน์แรกที่มีองค์ประกอบทั้งสองตรงข้ามกับที่ต้องการรับ 5 ดาต้าพอยน์แรกที่มีเพียงองค์ประกอบแรกเท่านั้น มีวิธีทำเช่นนี้หรือไม่?
lawchit

2
@lawchit - ดูคำตอบที่อัปเดตของฉัน หากคุณกำลังจะทำคณิตศาสตร์กับข้อมูลนี้ฉันขอแนะนำให้ใช้ NumPy
DaoWen

อันนี้สมควรได้รับอีก 100 คะแนน :-) ฉันได้มองหาวิธีแก้ปัญหานี้เป็นเวลา 1 วันเต็ม
Mamun

16

นี่คือตัวอย่างง่ายๆที่อ่านในjsonไฟล์ข้อความจากพจนานุกรม โปรดทราบว่าไฟล์ json ของคุณต้องเป็นไปตามมาตรฐาน json ดังนั้นจึงต้องมี"เครื่องหมายคำพูดคู่แทน'คำพูดเดี่ยว

ไฟล์ JSON dump.txt ของคุณ:

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

สคริปต์ Python:

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

8

คุณสามารถใช้สิ่งต่อไปนี้:

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 ลงในพจนานุกรมคือคุณสามารถใช้ inbuilt json loader

ด้านล่างคือตัวอย่างข้อมูลตัวอย่างที่สามารถใช้ได้

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

คำสั่ง 'เปิด' จะปิดไฟล์ json โดยอัตโนมัติในกรณีนี้ทำไม ฉันสังเกตเห็นว่าคุณไม่ได้ใช้ตัวจัดการบริบท
Moondra

1
@Moondra U ต้องใช้ปิด () เพื่อปิดไฟล์
Sampat Kumar

2
@ Moondra คุณสามารถใช้with()โอเปอเรเตอร์แทนการเปิดและปิดไฟล์ได้จากเว็บไซต์: with open("welcome.txt") as file: ดู: pythonforbeginners.com/files/with-statement-in-python
Aceofspadez44

0

ฉันกำลังทำงานกับรหัส Python สำหรับ REST API ดังนั้นนี่สำหรับผู้ที่ทำงานในโครงการที่คล้ายกัน

ฉันดึงข้อมูลจาก URL โดยใช้คำขอ POST และเอาต์พุตดิบคือ JSON ด้วยเหตุผลบางประการผลลัพธ์เป็นพจนานุกรมอยู่แล้วไม่ใช่รายการและฉันสามารถอ้างถึงปุ่มพจนานุกรมที่ซ้อนกันได้ทันทีเช่นนี้

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

โดยที่ datapoint_1 อยู่ในพจนานุกรม datapoints


-1

ส่งผ่านข้อมูลโดยใช้ javascript ajax จาก get method

    **//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

    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
นี่เป็นคำตอบของคำถามหรือไม่
Siong Thye Goh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.