Konversi kamus ke JSON

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

Saya tidak dapat mengakses data saya di JSON. Apa yang saya lakukan salah?

TypeError: string indices must be integers, not str
sheetal_158
sumber

Jawaban:

536

json.dumps()mengonversi kamus ke strobjek, bukan json(dict)objek! Jadi, Anda harus memuat strke dalam dictuntuk menggunakannya dengan menggunakan json.loads()metode

Lihat json.dumps()sebagai metode penyimpanan dan json.loads()sebagai metode pengambilan.

Ini adalah contoh kode yang dapat membantu Anda lebih memahaminya:

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
Iman Mirzadeh
sumber
11
tidakkah Anda pikir itu agak tidak efisien untuk memuat json kembali ke variabel yang terpisah loaded_r, mengingat Anda sudah memilikinya r?
Tim
Hai! Saya menyadari ini adalah jawaban yang sangat lama, tetapi saya berharap Anda dapat menghapus satu hal. @TimCastelijns menyebutkan bahwa tidak efisien untuk memuat json kembali ke variabel baru loaded_r. Apakah cara yang efisien untuk melakukan ini adalah dengan hanya menyatakan r = json.loads (r)?
SchrodingersStat
2
@SchrodingersStat Hai. Saya tidak berpikir ini banyak mengubah kinerja. Anda dapat memeriksa menggunakan fungsi 'timeit'. Jika Anda benar-benar menginginkan json load / dump yang cepat, Anda dapat menggunakan perpustakaan 'ujson'!
Iman Mirzadeh
14
Saya curiga @TimCastelijns telah salah mengerti maksud Imran. JSON dimuat ke variabel baru bukan karena itu adalah informasi baru, tetapi untuk menunjukkan bahwa nilai-nilai dalam kamus baru, yaitu setelah JSON menyandikan dan mendekode pulang-pergi, adalah identik.
Dumbledad
43

json.dumps()mengembalikan representasi string JSON dari dict python. Lihat dokumen

Anda tidak dapat melakukannya r['rating']karena r adalah string, bukan dict lagi

Mungkin maksudmu seperti itu

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

Tidak perlu mengonversinya menjadi string dengan menggunakan json.dumps()

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

Anda bisa mendapatkan nilai langsung dari objek dict.

pengguna3273866
sumber
0

Mendefinisikan r sebagai kamus harus melakukan trik:

>>> r: dict = {'is_claimed': 'True', 'rating': 3.5}
>>> print(r['rating'])
3.5
>>> type(r)
<class 'dict'>
Aslan
sumber