Convertendo dicionário para JSON

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

Não consigo acessar meus dados no JSON. O que estou fazendo errado?

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

Respostas:

536

json.dumps()converte um dicionário em strobjeto, não um json(dict)objeto! Então você tem que carregar seu strem um dictpara usá-lo usando o json.loads()método

Veja json.dumps()como um método de salvamento e json.loads()como um método de recuperação.

Este é o exemplo de código que pode ajudá-lo a entender mais:

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
fonte
11
você não acha que é um pouco ineficiente carregar o json de volta em uma variável separada loaded_r, considerando que você já o inseriu r?
Tim
Oi! Sei que essa é uma resposta muito antiga, mas esperava que você pudesse esclarecer uma coisa. O @TimCastelijns mencionou que é ineficiente carregar o json novamente em uma nova variável loaded_r. A maneira eficiente de fazer isso seria declarar apenas r = json.loads (r)?
usar o seguinte
2
@SchrodingersStat Hi. Não acho que isso mude muito o desempenho. Você pode verificar usando a função 'timeit'. Se você realmente quer um carregamento / despejo json rápido, pode usar a biblioteca 'ujson'!
Iman Mirzadeh
14
Suspeito que @TimCastelijns tenha entendido mal a intenção de Imran. O JSON é carregado em uma nova variável, não porque são novas informações, mas para mostrar que os valores no novo dicionário, ou seja, após a codificação e decodificação do JSON de ida e volta, são idênticos.
dumbledad
43

json.dumps()retorna a representação de string JSON do dict python. Veja os documentos

Você não pode fazer r['rating']porque r é uma string, não um ditado

Talvez você quisesse dizer algo como

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

Não há necessidade de convertê-lo em uma string usando json.dumps()

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

Você pode obter os valores diretamente do objeto dict.

user3273866
fonte
0

Definir r como um dicionário deve fazer o truque:

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