Tengo este JSON en un archivo:
{
"maps": [
{
"id": "blabla",
"iscategorical": "0"
},
{
"id": "blabla",
"iscategorical": "0"
}
],
"masks": [
"id": "valore"
],
"om_points": "value",
"parameters": [
"id": "valore"
]
}
Escribí este script para imprimir todos los datos JSON:
import json
from pprint import pprint
with open('data.json') as f:
data = json.load(f)
pprint(data)
Sin embargo, este programa plantea una excepción:
Traceback (most recent call last):
File "<pyshell#1>", line 5, in <module>
data = json.load(f)
File "/usr/lib/python3.5/json/__init__.py", line 319, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.5/json/decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.5/json/decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 13 column 13 (char 213)
¿Cómo puedo analizar el JSON y extraer sus valores?
Respuestas:
Sus datos no son válidos en formato JSON . Tienes
[]
cuando deberías tener{}
:[]
son para matrices JSON, que se llamanlist
en Python{}
son para objetos JSON, que se llamandict
en PythonAsí es como debería verse su archivo JSON:
Entonces puedes usar tu código:
Con los datos, ahora también puede encontrar valores así:
Pruébelos y vea si comienza a tener sentido.
fuente
u'
antes de cada clave. ¿Alguna idea de por qué?Su
data.json
debe tener este aspecto:Tu código debe ser:
Tenga en cuenta que esto solo funciona en Python 2.6 y
with
versiones posteriores, ya que depende de la declaración . En Python 2.5from __future__ import with_statement
, en Python <= 2.4, vea la respuesta de Justin Peel , en la que se basa esta respuesta.Ahora también puede acceder a valores individuales como este:
fuente
data_file
open
editado más tiempo del necesario.pprint
ing enwith
-context mantiene ladata_file
apertura por más tiempo.data["om_points"]
,data["masks"]["id"]
. La idea es que puede alcanzar cualquier nivel en un diccionario especificando las 'rutas clave'. Si obtiene unaKeyError
excepción, significa que la clave no existe en la ruta. Busque errores tipográficos o revise la estructura de su diccionario.La respuesta de Justin Peel es realmente útil, pero si está utilizando Python 3, la lectura de JSON debe hacerse así:
Nota: use en
json.loads
lugar dejson.load
. En Python 3,json.loads
toma un parámetro de cadena.json.load
toma un parámetro de objeto similar a un archivo.data_file.read()
devuelve un objeto de cadena.Para ser honesto, no creo que sea un problema cargar todos los datos json en la memoria la mayoría de los casos.
fuente
json.load
evitarse.loads
en Python 3?load
.fuente
json.loads
no decodifica múltiples objetos json. De lo contrario, obtendrá el error 'Datos adicionales'.}
,]
o"
). Por lo tanto, puede concatenar múltiples objetos en una sola cadena o un solo archivo, sin ambigüedad. El problema aquí es que un analizador que espera un solo objeto falla cuando se pasa más de un objeto..jsonl
(líneas json), los objetos están separados por un carácter de nueva línea que hace que el procesamiento previo para el análisis sea trivial y permite para dividir / procesar fácilmente archivos por lotes sin preocuparse por los marcadores de inicio / fin."Ultra JSON" o simplemente "ujson" puede manejar tener
[]
en su entrada de archivo JSON. Si está leyendo un archivo de entrada JSON en su programa como una lista de elementos JSON; tales como,[{[{}]}, {}, [], etc...]
ujson puede manejar cualquier orden arbitrario de listas de diccionarios, diccionarios de listas.Puede encontrar ujson en el índice del paquete Python y la API es casi idéntica a la
json
biblioteca incorporada de Python .ujson también es mucho más rápido si está cargando archivos JSON más grandes. Puede ver los detalles de rendimiento en comparación con otras bibliotecas JSON de Python en el mismo enlace proporcionado.
fuente
Si está utilizando Python3, puede intentar cambiar su
connection.json
JSON ( archivo) a:Luego usando el siguiente código:
fuente
with
declaración sería mejorAquí tienes el
data.json
archivo modificado :Puede llamar o imprimir datos en la consola utilizando las siguientes líneas:
Salida esperada para
print(data_item['parameters'][0]['id'])
:Salida esperada para
print(data_item['parameters'][0]['id'])
:fuente
Hay dos tipos en este análisis.
Desde un archivo, puede usar lo siguiente
Este artículo explica el análisis completo y la obtención de valores utilizando dos escenarios. Analizando JSON usando Python
fuente
Como usuario de python3 ,
La diferencia entre
load
y losloads
métodos es importante, especialmente cuando lee datos json del archivo.Como se indica en los documentos:
json.load:
json.loads:
El método json.load puede leer directamente el documento json abierto, ya que puede leer archivos binarios.
Como resultado, sus datos json están disponibles en un formato especificado de acuerdo con esta tabla de conversión:
https://docs.python.org/3.7/library/json.html#json-to-py-table
fuente