Código de Python para cargar datos de algún archivo JSON largo y complicado:
with open(filename, "r") as f:
data = json.loads(f.read())
(nota: la mejor versión del código debe ser:
with open(filename, "r") as f:
data = json.load(f)
pero ambos exhiben un comportamiento similar)
Para muchos tipos de error JSON (delimitadores faltantes, barras invertidas incorrectas en cadenas, etc.), esto imprime un mensaje útil que contiene la línea y el número de columna donde se encontró el error JSON.
Sin embargo, para otros tipos de error JSON (incluido el clásico "usar una coma en el último elemento de una lista", pero también otras cosas como capitalizar verdadero / falso), la salida de Python es solo:
Traceback (most recent call last):
File "myfile.py", line 8, in myfunction
config = json.loads(f.read())
File "c:\python27\lib\json\__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "c:\python27\lib\json\decoder.py", line 360, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "c:\python27\lib\json\decoder.py", line 378, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
Para ese tipo de ValueError, ¿cómo hace que Python le diga dónde está el error en el archivo JSON?
json.load(f)
lugar dejson.loads(f.read())
Respuestas:
Descubrí que el
simplejson
módulo proporciona errores más descriptivos en muchos casos en los que el módulo incorporadojson
es vago. Por ejemplo, para el caso de tener una coma después del último elemento de una lista:lo cual no es muy descriptivo. La misma operación con
simplejson
:¡Mucho mejor! Del mismo modo para otros errores comunes como capitalizar
True
.fuente
json
biblioteca stdlib se ha actualizado y proporciona el nuevo formato de mensaje de error. Sin embargo, no tengo tiempo para rastrear versiones exactas en este momento.No podrá hacer que Python le diga dónde está incorrecto el JSON. Tendrá que usar un linter en línea en algún lugar como este
Esto le mostrará un error en el JSON que está tratando de decodificar.
fuente
Puede probar la biblioteca rson que se encuentra aquí: http://code.google.com/p/rson/ . También estoy en PYPI: https://pypi.python.org/pypi/rson/0.9 para que pueda usar easy_install o pip para obtenerlo.
para el ejemplo dado por tom:
RSON está diseñado para ser un superconjunto de JSON, por lo que puede analizar archivos JSON. También tiene una sintaxis alternativa que es mucho más agradable para que los humanos la vean y editen. Lo uso bastante para archivos de entrada.
En cuanto a la capitalización de valores booleanos: parece que rson lee booleanos con mayúsculas incorrectamente como cadenas.
fuente
Tuve un problema similar y se debió a comillas simples. El estándar JSON ( http://json.org ) solo habla sobre el uso de comillas dobles, por lo que debe ser que la
json
biblioteca de Python solo admite comillas dobles.fuente
Para mi versión particular de este problema, seguí y busqué la declaración de función
load_json_file(path)
dentro delpackaging.py
archivo, luego pasé unaprint
línea de contrabando :De esa manera, imprimiría el contenido del archivo json antes de ingresar el try-catch, y de esa manera, incluso con mi conocimiento de Python apenas existente, pude averiguar rápidamente por qué mi configuración no podía leer el archivo json.
(Fue porque había configurado mi editor de texto para escribir una lista de materiales UTF-8 ... estúpido)
Solo menciono esto porque, aunque tal vez no sea una buena respuesta al problema específico del OP, este fue un método bastante rápido para determinar la fuente de un error muy opresivo. Y apuesto a que muchas personas se toparán con este artículo que están buscando una solución más detallada para a
MalformedJsonFileError: No JSON object could be decoded when reading …
. Entonces eso podría ayudarlos.fuente
with open(fn) as f
), se encarga de cerrar el archivo en una excepción para usted. en.wikibooks.org/wiki/Python_Programming/...En cuanto a mí, mi archivo json es muy grande, cuando uso común
json
en python obtiene el error anterior.Después de instalar
simplejson
porsudo pip install simplejson
.Y luego lo resolví.
fuente
Tuve un problema similar, este era mi código:
El problema era que me había olvidado de
file.close()
hacerlo y lo solucioné.fuente
with open(fn) as f
), se encarga de cerrar el archivo en una excepción para usted. en.wikibooks.org/wiki/Python_Programming/...La respuesta aceptada es la más fácil de solucionar. Pero en caso de que no pueda instalar el simplejson debido a la política de su empresa, le propongo la siguiente solución para solucionar el problema particular de "usar comas en el último elemento de una lista" :
Cree una clase secundaria "JSONLintCheck" para heredar de la clase "JSONDecoder" y anule el método init de la clase "JSONDecoder" como se muestra a continuación:
fuente
Simplemente pulse el mismo problema y, en mi caso, el problema estaba relacionado con
BOM
(marca de orden de bytes) al comienzo del archivo.json.tool
se negaría a procesar incluso el archivo vacío (solo llaves) hasta que elimine la marca UTF BOM.Lo que he hecho es:
set nobomb
)Esto resolvió el problema con json.tool. ¡Espero que esto ayude!
fuente
Cuando se crea su archivo. En lugar de crear un archivo con contenido está vacío. Reemplazar con:
fuente
Podría usar cjson , que afirma ser hasta 250 veces más rápido que las implementaciones de Python puro, dado que tiene "algún archivo JSON complicado y largo" y probablemente necesitará ejecutarlo varias veces (los decodificadores fallan e informan el primer error solo encuentro).
fuente