¿Por qué no puede Python analizar estos datos JSON?

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) 

Este progtwig plantea una excepción, sin embargo:

 Traceback (most recent call last): File "", line 5, in  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?

Sus datos no son válidos en formato JSON . Tienes [] cuando deberías tener {} :

  • [] son para matrices JSON, que se llaman list en Python
  • {} son para objetos JSON, que se llaman dict en Python

Así es como debería verse su archivo JSON:

 { "maps": [ { "id": "blabla", "iscategorical": "0" }, { "id": "blabla", "iscategorical": "0" } ], "masks": { "id": "valore" }, "om_points": "value", "parameters": { "id": "valore" } } 

Entonces puedes usar tu código:

 import json from pprint import pprint with open('data.json') as f: data = json.load(f) pprint(data) 

Con los datos, ahora también puedes encontrar valores así:

 data["maps"][0]["id"] data["masks"]["id"] data["om_points"] 

Pruébalos y ve si comienza a tener sentido.

Tu data.json debería verse así:

 { "maps":[ {"id":"blabla","iscategorical":"0"}, {"id":"blabla","iscategorical":"0"} ], "masks": {"id":"valore"}, "om_points":"value", "parameters": {"id":"valore"} } 

Su código debe ser:

 import json from pprint import pprint with open('data.json') as data_file: data = json.load(data_file) pprint(data) 

Tenga en cuenta que esto solo funciona en Python 2.6 y superior, ya que depende de la instrucción -con . En Python 2.5 use from __future__ import with_statement , en Python <= 2.4, vea la respuesta de Justin Peel , en la que se basa esta respuesta.

Ahora también puedes acceder a valores únicos como este:

 data["maps"][0]["id"] # will return 'blabla' data["masks"]["id"] # will return 'valore' data["om_points"] # will return 'value' 

La respuesta de Justin Peel es realmente útil, pero si está usando Python 3, la lectura de JSON debería hacerse de la siguiente manera:

 with open('data.json', encoding='utf-8') as data_file: data = json.loads(data_file.read()) 

Nota: use json.loads lugar de json.load . En Python 3, json.loads toma un parámetro de cadena. json.load toma un parámetro de objeto tipo archivo. data_file.read() devuelve un objeto de cadena.

 data = [] with codecs.open('d:\output.txt','rU','utf-8') as f: for line in f: data.append(json.loads(line)) 

“Ultra JSON” o simplemente “ujson” puede manejar tener [] en la entrada del archivo JSON. Si está leyendo un archivo de entrada JSON en su progtwig 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 biblioteca json 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.

Si estás en Python 3, aquí es cómo puedes hacerlo.

 { "connection1": { "DSN": "con1", "UID": "abc", "PWD": "1234", "connection_string_python":"test1" } , "connection2": { "DSN": "con2", "UID": "def", "PWD": "1234" } } 

El código debe verse como asumiendo que el archivo connection.json se ve como arriba

 connection_file = open('connection.json', 'r') conn_string = json.load(connection_file) conn_string['connection1']['connection_string_python']) connection_file.close() >>>test1 
  # Here you go with modified json file: # data.json file : { "maps": [ { "id": "blabla", "iscategorical": "0" }, { "id": "blabla", "iscategorical": "0" } ], "masks": [{ "id": "valore" }], "om_points": "value", "parameters": [{ "id": "valore" }] } # You can call or print data on console by using below lines import json from pprint import pprint with open('data.json') as data_file: data_item = json.load(data_file) pprint(data_item) print(data_item['parameters'][0]['id']) #Output : #pprint(data_item) output as : {'maps': [{'id': 'blabla', 'iscategorical': '0'}, {'id': 'blabla', 'iscategorical': '0'}], 'masks': [{'id': 'valore'}], 'om_points': 'value', 'parameters': [{'id': 'valore'}]} #print(data_item['parameters'][0]['id']) output as : valore 

Hay dos tipos en este análisis.

  1. Análisis de datos de un archivo desde una ruta del sistema
  2. Analizar JSON desde una URL remota.

Desde un archivo, puede utilizar los siguientes

 import json json = json.loads(open('/path/to/file.json').read()) value = json['key'] print json['value'] 

Este artículo explica el análisis completo y la obtención de valores utilizando dos escenarios. Analizando JSON usando Python

Como usuario de Python3 ,

La diferencia entre los métodos de load y loads es importante, especialmente cuando lees datos json del archivo.

Como se indica en los documentos:

json.load:

Deserialize fp (un .read (): archivo de texto compatible o archivo binario que contiene un documento JSON) a un objeto Python utilizando esta tabla de conversión.

json.loads:

json.loads: Deserialize s (una instancia de str, bytes o bytearray que contiene un documento JSON) a un objeto Python utilizando esta tabla de conversión.

El método json.load puede leer directamente el documento json abierto ya que puede leer un archivo binario.

 with open('./recipes.json') as data: all_recipes = json.load(data) 

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