Chuyển đổi từ điển sang JSON


346
r = {'is_claimed': 'True', 'rating': 3.5}
r = json.dumps(r)
file.write(str(r['rating']))

Tôi không thể truy cập dữ liệu của mình trong JSON. Tôi đang làm gì sai?

TypeError: string indices must be integers, not str

Câu trả lời:


535

json.dumps()chuyển đổi một từ điển thành strđối tượng, không phải là một json(dict)đối tượng! Vì vậy, bạn phải tải của bạn strvào một dictđể sử dụng nó bằng cách sử dụng json.loads()phương thức

Xem json.dumps()như một phương thức lưu và json.loads()như một phương thức lấy.

Đây là mẫu mã có thể giúp bạn hiểu thêm về nó:

import json

r = {'is_claimed': 'True', 'rating': 3.5}
r = json.dumps(r)
loaded_r = json.loads(r)
loaded_r['rating'] #Output 3.5
type(r) #Output str
type(loaded_r) #Output dict

11
bạn không nghĩ rằng việc tải json trở lại vào một biến riêng biệt là không hiệu quả loaded_r, vì bạn đã có nó rchưa?
Tim

Chào! Tôi nhận ra đây là một câu trả lời rất cũ, nhưng tôi đã hy vọng bạn có thể làm rõ một điều. @TimCastelijns đã đề cập rằng việc tải json trở lại vào một biến mới load_r không hiệu quả. Cách hiệu quả để làm điều này là chỉ nêu r = json.loads (r)?
SchrodingersStat

2
@SchrodingersStat Xin chào. Tôi không nghĩ rằng điều này thay đổi hiệu suất rất nhiều. Bạn có thể kiểm tra bằng cách sử dụng chức năng 'timeit'. Nếu bạn thực sự muốn tải / đổ json nhanh, bạn có thể sử dụng thư viện 'ujson'!
Iman Mirzadeh

14
Tôi nghi ngờ @TimCastelijns đã hiểu nhầm ý định của Imran. JSON được tải vào một biến mới không phải vì đó là thông tin mới, nhưng để cho thấy rằng các giá trị trong từ điển mới, tức là sau khi mã hóa JSON và giải mã khứ hồi, giống hệt nhau.
dumbledad 22/03/19

43

json.dumps()trả về biểu diễn chuỗi JSON của dict python. Xem tài liệu

Bạn không thể làm r['rating']bởi vì r là một chuỗi, không phải là một dict nữa

Có lẽ bạn có ý gì đó như

r = {'is_claimed': 'True', 'rating': 3.5}
json = json.dumps(r) # note i gave it a different name
file.write(str(r['rating']))

2

Không cần phải chuyển đổi nó trong một chuỗi bằng cách sử dụng json.dumps()

r = {'is_claimed': 'True', 'rating': 3.5}
file.write(r['is_claimed'])
file.write(str(r['rating']))

Bạn có thể lấy các giá trị trực tiếp từ đối tượng dict.


0

Xác định r là một từ điển nên thực hiện các mẹo:

>>> r: dict = {'is_claimed': 'True', 'rating': 3.5}
>>> print(r['rating'])
3.5
>>> type(r)
<class 'dict'>
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.