การแปลงพจนานุกรมเป็น JSON


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

ฉันไม่สามารถเข้าถึงข้อมูลของฉันใน JSON ผมทำอะไรผิดหรือเปล่า?

TypeError: string indices must be integers, not str

คำตอบ:


536

json.dumps()แปลงพจนานุกรมเป็นstrวัตถุไม่ใช่json(dict)วัตถุ! ดังนั้นคุณต้องโหลดของคุณstrลงdictเพื่อใช้งานโดยใช้json.loads()วิธีการ

ดูjson.dumps()เป็นวิธีการบันทึกและjson.loads()เป็นวิธีการดึง

นี่คือตัวอย่างโค้ดที่อาจช่วยให้คุณเข้าใจได้มากขึ้น:

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
คุณไม่คิดว่ามันไม่มีประสิทธิภาพเล็กน้อยในการโหลด json กลับไปเป็นตัวแปรที่แยกต่างหากloaded_rพิจารณาว่าคุณมีมันอยู่แล้วr?
ทิม

Hi! ฉันรู้ว่านี่เป็นคำตอบที่เก่ามาก แต่ฉันหวังว่าคุณจะสามารถล้างสิ่งหนึ่งได้ @TimCastelijns กล่าวว่ามันไม่มีประสิทธิภาพในการโหลด json กลับไปเป็นตัวแปรใหม่ load_r วิธีที่มีประสิทธิภาพในการทำเช่นนี้จะเพียงแค่ระบุ r = json.loads (r)
Schrodingers เริ่ม

2
@SchrodingersStat สวัสดี ฉันไม่คิดว่าการเปลี่ยนแปลงนี้จะมีประสิทธิภาพมากนัก คุณสามารถตรวจสอบได้โดยใช้ฟังก์ชั่น 'timeit' หากคุณต้องการโหลด / ถ่ายโอนข้อมูล json ที่รวดเร็วจริง ๆ คุณสามารถใช้ไลบรารี 'ujson' ได้!
Iman Mirzadeh

14
ฉันสงสัยว่า @TimCastelijns เข้าใจผิดเจตนาของ Imran JSON ถูกโหลดลงในตัวแปรใหม่ไม่ใช่เพราะมันเป็นข้อมูลใหม่ แต่เพื่อแสดงให้เห็นว่าค่าในพจนานุกรมใหม่คือหลังจากการเข้ารหัส JSON และถอดรหัสการเดินทางรอบเหมือนกัน
dumbledad

43

json.dumps()ส่งคืนการแทนค่าสตริง JSON ของ pict dython ดูเอกสาร

คุณทำไม่ได้r['rating']เพราะ r เป็นสตริงไม่ใช่ dict อีกต่อไป

บางทีคุณอาจต้องการความหมายบางอย่าง

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

2

ไม่จำเป็นต้องแปลงเป็นสตริงโดยใช้ json.dumps()

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

คุณสามารถรับค่าโดยตรงจากวัตถุ dict


1

การกำหนด r เป็นพจนานุกรมควรทำเคล็ดลับ:

>>> r: dict = {'is_claimed': 'True', 'rating': 3.5}
>>> print(r['rating'])
3.5
>>> type(r)
<class 'dict'>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.