Перетворення словника в JSON


347
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?
Тім

Привіт! Я усвідомлюю, що це дуже стара відповідь, але я сподівався, що ви зможете прояснити одне. @TimCastelijns зазначав, що неефективно завантажувати json у нову змінну load_r. Чи ефективним способом цього було б просто вказати r = json.loads (r)?
SchrodingerStat

2
@SchrodingersStat Привіт. Я не думаю, що це сильно змінює продуктивність. Ви можете перевірити за допомогою функції 'timeit'. Якщо ви дійсно хочете швидкого завантаження / скидання json, ви можете використовувати бібліотеку 'ujson'!
Іман Мірзаде

14
Я підозрюю, що @TimCastelijns неправильно зрозумів наміри Імрана. JSON завантажується в нову змінну не тому, що це нова інформація, а для того, щоб показати, що значення в новому словнику, тобто після кодування JSON і декодування в обидва кінці, однакові.
dumbledad

43

json.dumps()повертає рядкове JSON-зображення піктону python. Дивіться документи

Ви не можете цього зробити, r['rating']тому що r - це рядок, а не диктант

Можливо, ви мали на увазі щось подібне

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'>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.