Преобразование словаря в 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?
Тим

Здравствуй! Я понимаю, что это очень старый ответ, но я надеялся, что вы можете прояснить одну вещь. @TimCastelijns упомянул, что неэффективно загружать json обратно в новую переменнуюloaded_r. Будет ли эффективный способ сделать это просто указать r = json.loads (r)?
SchrodingersStat

2
@SchrodingersStat Привет. Я не думаю, что это сильно меняет производительность. Вы можете проверить, используя функцию «timeit». Если вы действительно хотите быструю загрузку / выгрузку json, вы можете использовать библиотеку 'ujson'!
Иман Мирзаде

14
Я подозреваю, что @TimCastelijns неправильно понял намерение Имрана. JSON загружается в новую переменную не потому, что это новая информация, а для того, чтобы показать, что значения в новом словаре, то есть после кодирования и декодирования JSON в обоих направлениях, идентичны.
Дамблдад

43

json.dumps()возвращает строковое представление JSON для python dict. Посмотреть документы

Вы не можете сделать это, r['rating']потому что г это строка, а не диктат больше

Возможно, вы имели в виду что-то вроде

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.