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

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

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']))

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.


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'>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.