¿Leyendo JSON de un archivo?
Estoy recibiendo un poco de dolor de cabeza solo porque una simple mirada, declaración fácil está lanzando algunos errores en mi 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 me enteré, pero no está funcionando:
import json
from pprint import pprint
with open('strings.json') as json_data:
d = json.load(json_data)
json_data.close()
pprint(d)
El error mostrado en la consola fue el siguiente:
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
a json.load
Y tengo 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]
5 answers
El json.load()
method (sin "s" en "load") puede leer un archivo directamente:
import json
with open('strings.json') as json_data:
d = json.load(json_data)
print(d)
Estabas usando el json.loads()
method , que se usa solo para los argumentos string.
Editar: El nuevo mensaje es un problema totalmente diferente. En ese caso, hay algún json inválido 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 hago automáticamente ¿corregir una cadena JSON no válida?.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:24
Aquí hay una copia del código que funciona bien para mí
import json
with open("test.json") as json_file:
json_data = json.load(json_file)
print(json_data)
Con los datos
{
"a": [1,3,"asdf",true],
"b": {
"Hello": "world"
}
}
Es posible que desee envolver su json.cargue la línea con una captura de prueba porque JSON no válido causará un mensaje de error de stacktrace.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-25 18:46:17
El problema es usar con instrucción:
with open('strings.json') as json_data:
d = json.load(json_data)
pprint(d)
El archivo ya se va a cerrar implícitamente. No es necesario volver a llamar a json_data.close()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-07 18:28:45
En python 3, podemos usar el siguiente método.
Leer desde el archivo y convertir a JSON
# Considering "json_list.json" is a json file
with open('json_list.json') as fd:
json_data = json.load(fd)
O
json_data = json.load(open('json_list.json'))
String to JSON
json_data = json.loads('{"name" : "myName", "age":24}')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-13 10:17:48
Para agregar esto, hoy puedes 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 del parámetro orient.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-17 10:17:44