¿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]
 222
Author: Łukasz Sromek, 2013-11-25

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?.

 383
Author: ubomb,
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.

 100
Author: user1876508,
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().

 36
Author: Zongjun,
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}')
 13
Author: Thejesh PR,
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.

 1
Author: Ando Jurai,
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