Conversión de diccionario a JSON

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

No puedo acceder a mis datos en el JSON. ¿Qué estoy haciendo mal?

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

Respuestas:

536

json.dumps()convierte un diccionario en strobjeto, no un json(dict)objeto! Entonces tienes que cargar tu stra dictpara usarlo usando el json.loads()método

Ver json.dumps()como método de guardar y json.loads()como método de recuperación.

Este es el ejemplo de código que podría ayudarlo a comprenderlo más:

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
fuente
11
¿no crees que es un poco ineficaz cargar el json en una variable separada loaded_r, considerando que ya lo tienes r?
Tim
¡Hola! Me doy cuenta de que esta es una respuesta muy antigua, pero esperaba que pudieras aclarar una cosa. @TimCastelijns mencionó que no es eficiente cargar el json nuevamente en una nueva variable loaded_r. ¿Sería la forma eficiente de hacer esto simplemente declarar r = json.loads (r)?
SchrodingersStat
2
@SchrodingersStat Hola. No creo que esto cambie mucho el rendimiento. Puede verificar usando la función 'timeit'. Si realmente quieres una carga / descarga rápida de json, ¡puedes usar la biblioteca 'ujson'!
Iman Mirzadeh
14
Sospecho que @TimCastelijns ha entendido mal la intención de Imran. El JSON se carga en una nueva variable no porque sea información nueva, sino para mostrar que los valores en el nuevo diccionario, es decir, después de la codificación y decodificación JSON de ida y vuelta, son idénticos.
dumbledad
43

json.dumps()devuelve la representación de cadena JSON del dict python. Ver los documentos

No puedes hacerlo r['rating']porque r es una cadena, ya no es un dict

Quizás quisiste decir 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
fuente
2

No es necesario convertirlo en una cadena usando json.dumps()

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

Puede obtener los valores directamente del objeto dict.

usuario3273866
fuente
0

Definir r como un diccionario debería hacer el truco:

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