Eres un traductor de español que traduce documentos de tecnología. Traduce lo siguiente al español: “El string json.loads no se está leyendo correctamente desde la API”.
No he tenido suerte encontrando por qué después de ejecutar el siguiente código,
import xmlrpc.client
import json
from tkinter import *
app = Tk()
api = xmlrpc.client.ServerProxy("http://user:pass@localhost:8442/")
listAddress = api.listAddresses()
print (listAddress)
jsonAddresses = json.loads(listAddress)
print (jsonAddresses)
Me dice que el objeto JSON debe ser una cadena. Añadí print (listAddress)
ahí para mostrar que de hecho es una cadena en formato JSON y la salida lo imprime justo antes de decirme que necesita ser una cadena. Se muestra aquí:
{'addresses': [{'chan': False, 'address': 'BM-2cXU266jqEXWN9GZ3syVP9dNiWM59z8br8', 'enabled': True, 'stream': 1, 'label': 'unused API address'}, {'chan': False, 'address': 'BM-NB21wfaCzZvmX7BFrat1zSocRuYCMVvQ', 'enabled': True, 'stream': 1, 'label': 'unused API address'}]}
Traceback (most recent call last):
File "/home/otsudo/Code/part_manager-master/help.py", line 13, in <module>
jsonAddresses = json.loads(listAddress)
File "/usr/lib/python3.8/json/__init__.py", line 341, in loads
raise TypeError(f'the JSON object must be str, bytes or bytearray, '
TypeError: the JSON object must be str, bytes or bytearray, not dict
Debo estar omitiendo algo aquí. Agradezco toda la ayuda.
davy.ai
El problema en el código es que el método
json.loads()
espera una cadena como argumento, pero se le ha proporcionado un diccionario.Al observar la salida de
print(listAddress)
, se puede ver quelistAddress
ya es un diccionario con claves y valores en formato JSON. Por lo tanto, no es necesario utilizar el métodojson.loads()
enlistAddress
.En su lugar, el código debería acceder directamente a los valores del diccionario utilizando las claves. Por ejemplo, para obtener la lista de direcciones de
listAddress
, simplemente se puede usarlistAddress['addresses']
.El código modificado sería:
Esto imprimirá la lista de direcciones en el formato
[{'chan': False, 'address': 'BM-2cXU266jqEXWN9GZ3syVP9dNiWM59z8br8', 'enabled': True, 'stream': 1, 'label': 'unused API address'}, {'chan': False, 'address': 'BM-NB21wfaCzZvmX7BFrat1zSocRuYCMVvQ', 'enabled': True, 'stream': 1, 'label': 'unused API address'}]
.Tenga en cuenta que en el código original se importó el módulo
json
pero no se utilizó. Por lo tanto, se puede eliminar de las importaciones.