Me duele un poco el dolor de cabeza solo porque una declaración simple y fácil me arroja algunos errores en la cara.
Tengo un archivo json llamado strings.json como este:
"strings": [{"-name": "city", "#text": "City"}, {"-name": "phone", "#text": "Phone"}, ...,
{"-name": "address", "#text": "Address"}]
Quiero leer el archivo json, solo eso por ahora. Tengo estas declaraciones que descubrí, pero no funciona:
import json
from pprint import pprint
with open('strings.json') as json_data:
d = json.loads(json_data)
json_data.close()
pprint(d)
El error mostrado en la consola fue este:
Traceback (most recent call last):
File "/home/.../android/values/manipulate_json.py", line 5, in <module>
d = json.loads(json_data)
File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
TypeError: expected string or buffer
[Finished in 0.1s with exit code 1]
Editado
Cambiado de json.loads
ajson.load
y obtuve esto:
Traceback (most recent call last):
File "/home/.../android/values/manipulate_json.py", line 5, in <module>
d = json.load(json_data)
File "/usr/lib/python2.7/json/__init__.py", line 278, in load
**kw)
File "/usr/lib/python2.7/json/__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 369, in decode
raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 829 column 1 - line 829 column 2 (char 18476 - 18477)
[Finished in 0.1s with exit code 1]
{"strings": [{"-name": "city", "#text": "City"}, {"-name": "phone", "#text": "Phone"}, ..., {"-name": "address", "#text": "Address"}]}
Respuestas:
El
json.load()
método (sin "s" en "cargar") puede leer un archivo directamente:Estaba utilizando el
json.loads()
método , que se usa solo para argumentos de cadena .Editar: El nuevo mensaje es un problema totalmente diferente. En ese caso, hay algunos json no válidos en ese archivo. Para eso, recomendaría ejecutar el archivo a través de un validador json .
También hay soluciones para arreglar json, como por ejemplo ¿Cómo reparo automáticamente una cadena JSON no válida? .
fuente
Aquí hay una copia del código que funciona bien para mí.
con los datos
es posible que desee ajustar su línea json.load con un intento de captura porque JSON no válido causará un mensaje de error stacktrace.
fuente
El problema está usando con la declaración:
El archivo ya estará implícitamente cerrado. No hay necesidad de llamar
json_data.close()
nuevamente.fuente
print(json.dumps(d,sort_keys=True,indent=2))
En python 3, podemos usar el siguiente método.
Leer del archivo y convertir a JSON
Con la declaración, se cierra automáticamente el descriptor de archivo abierto.
Cadena a JSON
fuente
Para agregar esto, hoy puede usar pandas para importar json:
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_json.html Es posible que desee hacer un uso cuidadoso de Oriente. parámetro.
fuente
Puede usar la biblioteca de pandas para leer el archivo JSON.
fuente
Esto funciona para mi.
json.load () acepta el objeto de archivo, analiza los datos JSON, llena un diccionario de Python con los datos y se los devuelve.
Supongamos que el archivo JSON es así:
fuente