Chuyển đổi chuỗi JSON thành từ điển không liệt kê


213

Tôi đang cố gắng chuyển một tệp JSON và chuyển đổi dữ liệu thành từ điển.

Cho đến nay, đây là những gì tôi đã làm:

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

Tôi đang mong đợi json1_datalà một dictloại nhưng nó thực sự xuất hiện dưới dạng một listloại khi tôi kiểm tra nó type(json1_data).

Tôi đang thiếu gì? Tôi cần đây là một cuốn từ điển để tôi có thể truy cập một trong các khóa.


3
Bạn có thể chỉ cho chúng tôi một ví dụ về tệp JSON của bạn không?
Mac

Tôi cố gắng để truy cập vào 'datapoints' chìa khóa graphite.sdsc.edu:8443/render/...
lawchit

4
Mục cơ bản của bạn là một danh sách. thử json1_data[0]['datapoints'].
gddc

theo phỏng đoán tôi sẽ nói json của bạn là một danh sách không phải là từ điển
Joran Beasley

1
Từ những gì người hướng dẫn của chúng tôi đã chỉ cho chúng tôi, khi anh ấy gõ (json1_data), anh ấy đã trở thành kiểu 'dict'. Cảm ơn mọi người đã giúp đỡ!
luật

Câu trả lời:


276

JSON của bạn là một mảng với một đối tượng duy nhất bên trong, vì vậy khi bạn đọc nó trong đó bạn sẽ nhận được một danh sách với một từ điển bên trong. Bạn có thể truy cập từ điển của mình bằng cách truy cập mục 0 trong danh sách, như hiển thị bên dưới:

json1_data = json.loads(json1_str)[0]

Bây giờ bạn có thể truy cập dữ liệu được lưu trữ trong datapoint như bạn mong đợi:

datapoints = json1_data['datapoints']

Tôi có thêm một câu hỏi nếu ai đó có thể cắn: Tôi đang cố lấy trung bình của các phần tử đầu tiên trong các biểu dữ liệu này (tức là các biểu dữ liệu [0] [0]). Chỉ để liệt kê chúng, tôi đã thử thực hiện datapoint [0: 5] [0] nhưng tất cả những gì tôi nhận được là datapoint đầu tiên với cả hai yếu tố trái ngược với việc muốn lấy 5 datapoint đầu tiên chỉ chứa phần tử đầu tiên. Có cách nào để làm việc này không?

datapoints[0:5][0]không làm những gì bạn mong đợi. datapoints[0:5]trả về một lát danh sách mới chỉ chứa 5 phần tử đầu tiên, và sau đó thêm [0]vào phần cuối của nó sẽ chỉ lấy phần tử đầu tiên từ lát danh sách kết quả đó . Những gì bạn cần sử dụng để có được kết quả bạn muốn là một sự hiểu biết danh sách :

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

Đây là một cách đơn giản để tính giá trị trung bình:

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

Nếu bạn sẵn sàng cài đặt NumPy , thì điều đó thậm chí còn dễ dàng hơn:

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

Sử dụng ,toán tử với cú pháp cắt cho các mảng NumPy có hành vi mà bạn mong đợi ban đầu với các lát danh sách.


Cảm ơn vì điều này! Tôi có thêm một câu hỏi nếu ai đó có thể cắn: Tôi đang cố lấy trung bình của các phần tử đầu tiên trong các biểu dữ liệu này (tức là các biểu dữ liệu [0] [0]). Chỉ để liệt kê chúng, tôi đã thử thực hiện datapoint [0: 5] [0] nhưng tất cả những gì tôi nhận được là datapoint đầu tiên với cả hai yếu tố trái ngược với việc muốn lấy 5 datapoint đầu tiên chỉ chứa phần tử đầu tiên. Có cách nào để làm việc này không?
luật

2
@lawchit - Xem câu trả lời cập nhật của tôi. Nếu bạn định làm toán với dữ liệu này, tôi khuyên bạn nên sử dụng NumPy.
DaoWen

Điều này xứng đáng được thêm 100 điểm :-) Tôi đã tìm kiếm giải pháp này trong 1 ngày
Mamun

16

Đây là một đoạn đơn giản đọc trong jsontệp văn bản từ điển. Lưu ý rằng tệp json của bạn phải tuân theo tiêu chuẩn json, vì vậy nó phải có "dấu ngoặc kép thay vì 'dấu ngoặc đơn.

Tệp dump.txt JSON của bạn:

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

Tập lệnh Python:

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

8

Bạn có thể sử dụng như sau:

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

Cách tốt nhất để tải dữ liệu JSON vào từ điển là Bạn có thể sử dụng trình tải json sẵn có.

Dưới đây là đoạn mẫu có thể được sử dụng.

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

lệnh 'open' có tự động đóng tệp json trong trường hợp này không? Tôi nhận thấy bạn không sử dụng trình quản lý bối cảnh.
Moondra

1
@Moondra U phải sử dụng close () để đóng các tệp
Sampat Kumar

2
@Moondra bạn cũng có thể sử dụng with()toán tử thay vì phải mở và đóng tệp Từ trang web: with open("welcome.txt") as file: Xem: pythonforbeginners.com/files/with-statement-in-python
Aceofspadez44

0

Tôi đang làm việc với mã Python cho API REST, vì vậy đây là dành cho những người đang làm việc trên các dự án tương tự.

Tôi trích xuất dữ liệu từ một URL bằng yêu cầu POST và đầu ra thô là JSON. Vì một số lý do, đầu ra đã là một từ điển, không phải là một danh sách và tôi có thể tham khảo các khóa từ điển lồng nhau ngay lập tức, như thế này:

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

trong đó datapoint_1 nằm trong từ điển datapoints.


-1

truyền dữ liệu bằng cách sử dụng javascript ajax từ các phương thức 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);
              }
            }
          }

lượt xem 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
Đây có phải là một câu trả lời cho câu hỏi?
Siong Thye Goh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.