Python JSON: codificar (volcados), decodificar (cargas) y leer archivos JSON

ยฟQuรฉ es JSON en Python?

JSON in Python es un formato estรกndar inspirado en JavaScript para el intercambio y la transferencia de datos en formato de texto a travรฉs de una red. Generalmente, JSON tiene formato de cadena o texto. Puede ser utilizado por API y bases de datos, y representa objetos como pares nombre/valor. JSON significa JavaNotaciรณn de objetos de script.

Python Sintaxis JSON:

JSON se escribe como un par de clave y valor.

{
        "Key":  "Value",
        "Key":  "Value",
} 

JSON es muy similar a Python diccionario. Python admite JSON y tiene una biblioteca incorporada como JSON.

Biblioteca JSON en Python

"mariscal'Y'pepinillo' mรณdulos externos de Python mantener una versiรณn de JSON Python biblioteca. Trabajar con JSON en Python Para realizar operaciones relacionadas con JSON, como codificaciรณn y decodificaciรณn, primero debe importar biblioteca JSON y para eso en su py archivo,

import json

Los siguientes mรฉtodos estรกn disponibles en JSON Python mรณdulo

Mรฉtodo Descripciรณn
deshecho() codificaciรณn de objetos JSON
vertedero() escritura de cadena codificada en el archivo
cargas() Decodificar la cadena JSON
carga() Decodificar mientras se lee el archivo JSON

Python a JSON (Codificaciรณn)

JSON Biblioteca de Python realiza la siguiente traducciรณn de Python objetos en objetos JSON de forma predeterminada

Python JSON
dict Objeto
lista Formaciรณn
Unicode Cordรณn
nรบmero โ€“ int, largo nรบmero โ€“ int
flotar nรบmero โ€“ real
Cierto Cierto
Falso Falso
Ninguno Nulo

Conversiรณn Python La conversiรณn de datos a JSON se denomina operaciรณn de codificaciรณn. La codificaciรณn se realiza con la ayuda del mรฉtodo de la biblioteca JSON: deshecho()

Volcados JSON() en Python

json.dumps () in Python es un mรฉtodo que convierte objetos de diccionario de Python en formato de datos de cadena JSON. Resulta รบtil cuando se requiere que los objetos estรฉn en formato de cadena para operaciones como anรกlisis, impresiรณn, etc.

Ahora realicemos nuestro primer ejemplo de codificaciรณn json.dumps con Python:

import json

x = {
  "name": "Ken",
  "age": 45,
  "married": True,
  "children": ("Alice","Bob"),
  "pets": ['Dog'],
  "cars": [
    {"model": "Audi A1", "mpg": 15.1},
    {"model": "Zeep Compass", "mpg": 18.1}
  ]
}
# sorting result in asscending order by keys:
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)

Salida:

{"person": {"name": "Kenn", "sex": "male", "age": 28}})

Veamos un ejemplo de Python escriba JSON en un archivo para crear un archivo JSON del diccionario usando la misma funciรณn vertedero()

# here we create new data_file.json file with write mode using file i/o operation 
with open('json_file.json', "w") as file_write:
# write json data into file
json.dump(person_data, file_write)

Salida:

Nada que mostrar... En su sistema se crea json_file.json. Puede verificar ese archivo como se muestra a continuaciรณn, escriba JSON en el archivo Python ejemplo.

Python Ejemplo de codificaciรณn JSON

JSON a Python (Descodificaciรณn)

La decodificaciรณn de cadenas JSON se realiza con la ayuda del mรฉtodo incorporado json.loads () & json.cargar() de la biblioteca JSON en Python. Aquรญ la tabla de traducciรณn muestra un ejemplo de objetos JSON para Python objetos que son รบtiles para realizar la decodificaciรณn en Python de cadena JSON.

JSON Python
Objeto dict
Formaciรณn lista
Cordรณn Unicode
nรบmero โ€“ int nรบmero โ€“ int, largo
nรบmero โ€“ real flotar
Cierto Cierto
Falso Falso
Nulo Ninguno

Veamos un anรกlisis JSON bรกsico. Python ejemplo de decodificaciรณn con la ayuda de json.cargas funciรณn,

import json  # json library imported
# json data string
person_data = '{  "person":  { "name":  "Kenn",  "sex":  "male",  "age":  28}}'
# Decoding or converting JSON format in dictionary using loads()
dict_obj = json.loads(person_data)
print(dict_obj)
# check type of dict_obj
print("Type of dict_obj", type(dict_obj))
# get human object details
print("Person......",  dict_obj.get('person'))

Salida:

{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Type of dict_obj <class 'dict'>
Person...... {'name': 'John', 'sex': 'male'}

Python Ejemplo de decodificaciรณn JSON

Decodificar archivos JSON o analizar archivos JSON en Python

Ahora, aprenderemos cรณmo leer archivos JSON en Python con Python ejemplo de anรกlisis JSON:

NOTA: La decodificaciรณn de un archivo JSON es una operaciรณn relacionada con la entrada/salida (E/S) de archivos. El archivo JSON debe existir en su sistema en la ubicaciรณn especificada que usted menciona en su programa.

Python leer el archivo JSON Ejemplo:

import json
#File I/O Open function for read data from JSON File
with open('X:/json_file.json') as file_object:
        # store file data in object
        data = json.load(file_object)
print(data)

Aquรญ datos es un objeto de diccionario de Python como se muestra en el archivo JSON leรญdo arriba Python ejemplo.

Salida:

{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}

Analizando el archivo JSON en Python

Codificaciรณn compacta en Python

Cuando necesite reducir el tamaรฑo de su archivo JSON, puede usar codificaciรณn compacta en Python.

Ejemplo,

import json
# Create a List that contains dictionary
lst = ['a', 'b', 'c',{'4': 5, '6': 7}]
# separator used for compact representation of JSON.
# Use of ',' to identify list items
# Use of ':' to identify key and value in dictionary
compact_obj = json.dumps(lst, separators=(',', ':'))
print(compact_obj)

Salida:

'["a", "b", "c", {"4": 5, "6": 7}]'

** Here output of JSON is represented in a single line which is the most compact representation by removing the space character from compact_obj **

Formatear cรณdigo JSON (impresiรณn bonita)

  • El objetivo es escribir cรณdigo bien formateado para la comprensiรณn humana. Con la ayuda de una bonita impresiรณn, cualquiera puede entender fรกcilmente el cรณdigo.

Ejemplo:

import json
dic = { 'a': 4, 'b': 5 }
''' To format the code use of indent and 4 shows number of space and use of separator is not necessary but standard way to write code of particular function. '''
formatted_obj = json.dumps(dic, indent=4, separators=(',', ': '))
print(formatted_obj)

Salida:

{
   "a" : 4,
   "b" : 5
}

Formatear cรณdigo JSON Ejemplo

Para comprender mejor esto, cambie la sangrรญa a 40 y observe el resultado:

Formatear cรณdigo JSON Ejemplo

Ordenando el cรณdigo JSON:

ordenar_claves atributo en Python El argumento de la funciรณn dumps ordenarรก la clave en JSON en orden ascendente. El argumento sort_keys es un atributo booleano. Cuando es verdadero, se permite la ordenaciรณn; de lo contrario, no. Comprendamos con Python ejemplo de clasificaciรณn de cadena a JSON.

Ejemplo,

import json

x = {
  "name": "Ken",
  "age": 45,
  "married": True,
  "children": ("Alice", "Bob"),
  "pets": [ 'Dog' ],
  "cars": [
    {"model": "Audi A1", "mpg": 15.1},
    {"model": "Zeep Compass", "mpg": 18.1}
  	],
}
# sorting result in asscending order by keys:
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)

Salida:

{
    "age": 45,
    "cars": [ {
        "model": "Audi A1", 
        "mpg": 15.1
    },
    {
        "model": "Zeep Compass", 
        "mpg": 18.1
    }
    ],
    "children": [ "Alice",
		  "Bob"
	],
    "married": true,
    "name": "Ken",
    "pets": [ 
		"Dog"
	]
}

Como puede observar, las claves de edad, automรณviles, niรฑos, etc. estรกn ordenadas en orden ascendente.

Codificaciรณn de objetos complejos de Python

Un objeto complejo tiene dos partes diferentes que son

  1. Parte real
  2. Parte imaginaria

Codificaciรณn de objetos complejos de Python

Ejemplo: 3 +2i

Antes de codificar un objeto complejo, es necesario comprobar si una variable es compleja o no. Para ello, es necesario crear una funciรณn que compruebe el valor almacenado en una variable mediante un mรฉtodo de instancia.

Creemos la funciรณn especรญfica para verificar si el objeto es complejo o elegible para codificaciรณn.

import json

# create function to check instance is complex or not
def complex_encode(object):
    # check using isinstance method
    if isinstance(object, complex):
        return [object.real, object.imag]
    # raised error using exception handling if object is not complex
    raise TypeError(repr(object) + " is not JSON serialized")


# perform json encoding by passing parameter
complex_obj = json.dumps(4 + 5j, default=complex_encode)
print(complex_obj)

Salida:

'[4.0, 5.0]'

Decodificaciรณn de objetos JSON complejos en Python

Para decodificar un objeto complejo en JSON, use un parรกmetro object_hook que verifica si la cadena JSON contiene el objeto complejo o no. Veamos cรณmo se convierte una cadena en JSON Python Ejemplo,

import json
  # function check JSON string contains complex object
  def is_complex(objct):
    if '__complex__' in objct:
      return complex(objct['real'], objct['img'])
    return objct
  
  # use of json loads method with object_hook for check object complex or not
  complex_object =json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook = is_complex)
  #here we not passed complex object so it's convert into dictionary
  simple_object =json.loads('{"real": 6, "img": 7}', object_hook = is_complex)
  print("Complex_object......",complex_object)
  print("Without_complex_object......",simple_object)

Salida:

Complex_object...... (4+5j)
Without_complex_object...... {'real': 6, 'img': 7}

Descripciรณn general de la clase de serializaciรณn JSON JSONEncoder

La clase JSONEncoder se utiliza para la serializaciรณn de cualquier Python objeto mientras se realiza la codificaciรณn. Contiene tres mรฉtodos diferentes de codificaciรณn que son

  • predeterminado(o) โ€“ Implementado en la subclase y devuelve el objeto serializado para o objeto.
  • codificar(o) โ€“ Igual que los volcados JSON Python mรฉtodo devuelve una cadena JSON de Python estructura de datos.
  • itercodificaciรณn(o) โ€“ Representar cadenas una por una y codificar el objeto o.

Con la ayuda del mรฉtodo encode() de la clase JSONEncoder, tambiรฉn podemos codificar cualquier Python objeto como se muestra a continuaciรณn Python Ejemplo de codificador JSON.

# import JSONEncoder class from json
from json.encoder import JSONEncoder
colour_dict = { "colour": ["red", "yellow", "green" ]}
# directly called encode method of JSON
JSONEncoder().encode(colour_dict)

Salida:

'{"colour": ["red", "yellow", "green"]}'

Descripciรณn general de la clase de deserializaciรณn JSON JSONDecoder

La clase JSONDecoder se utiliza para la deserializaciรณn de cualquier Python objeto mientras se realiza la decodificaciรณn. Contiene tres mรฉtodos diferentes de decodificaciรณn que son

  • predeterminado(o) โ€“ Implementado en la subclase y devuelve objeto deserializado. o objeto.
  • decodificar (o) โ€“ Igual que el retorno del mรฉtodo json.loads() Python estructura de datos de una cadena o datos JSON.
  • raw_decode(o) - Representar Python diccionario uno por uno y decodificar el objeto o.

Con la ayuda del mรฉtodo decode() de la clase JSONDecoder, tambiรฉn podemos decodificar la cadena JSON como se muestra a continuaciรณn. Python Ejemplo de decodificador JSON.

import json
# import JSONDecoder class from json
from json.decoder import JSONDecoder
colour_string = '{ "colour": ["red", "yellow"]}'
# directly called decode method of JSON
JSONDecoder().decode(colour_string)

Salida:

{'colour': ['red', 'yellow']}

Decodificaciรณn de datos JSON de URL: ejemplo de la vida real

Obtendremos datos de CityBike NYC (Sistema de bicicletas compartidas) de la URL especificada (https://gbfs.citibikenyc.com/gbfs/2.3/gbfs.json) y convertirlo a formato de diccionario.

Python cargar JSON desde un archivo Ejemplo:

NOTA: - Asegรบrese de que la biblioteca de solicitudes ya estรฉ instalada en su Python, Si no, abra Terminal o CMD y escriba

  • (Por Python 3 o superior) solicitudes de instalaciรณn de pip3
import json
import requests

# get JSON string data from CityBike NYC using web requests library
json_response= requests.get("https://gbfs.citibikenyc.com/gbfs/2.3/gbfs.json")
# check type of json_response object
print(type(json_response.text))
# load data in loads() function of json library
bike_dict = json.loads(json_response.text)
#check type of news_dict
print(type(bike_dict))
# now get stationBeanList key data from dict
print(bike_dict['stationBeanList'][0]) 

Salida:

<class 'str'>
<class 'dict'>
{
	'id': 487,
 	'stationName': 'E 20 St & FDR Drive',
	'availableDocks': 24,
	'totalDocks': 34,
	'latitude': 40.73314259,
	'longitude': -73.97573881,
	'statusValue': 'In Service',
	'statusKey': 1,
	'availableBikes': 9,
	'stAddress1': 'E 20 St & FDR Drive',
	'stAddress2': '',
	'city': '',
	'postalCode': '',
	'location': '', 
	'altitude': '', 
	'testStation': False, 
	'lastCommunicationTime': '2018-12-11 10:59:09 PM', 'landMark': ''
}

Excepciones relacionadas con la biblioteca JSON en Python:

  • Clase json.JSONDecoderError maneja la excepciรณn relacionada con la operaciรณn de decodificaciรณn y es una subclase de Error de valor.
  • Excepciรณn - json.JSONDecoderError (mensaje, documento)
  • Los parรกmetros de excepciรณn son,
    • msg โ€“ Mensaje de error sin formato
    • doc โ€“ documentos JSON analizados
    • pos: inicia el รญndice del documento cuando falla
    • lineno โ€“ la lรญnea no presentada corresponde a pos
    • dos puntos โ€“ la columna no corresponde a pos

Python cargar JSON desde un archivo Ejemplo:

import json
#File I/O Open function for read data from JSON File
data = {} #Define Empty Dictionary Object
try:
        with open('json_file_name.json') as file_object:
                data = json.load(file_object)
except ValueError:
     print("Bad JSON file format,  Change JSON File")

Biblioteca JSON en Python

Infinito y NaN Numbers in Python

El formato de intercambio de datos JSON (RFC โ€“ Solicitud de comentarios) no permite valores infinitos o Nan, pero no hay restricciones en Python- Biblioteca JSON para realizar operaciones relacionadas con valores infinitos y Nan. Si JSON obtiene tipos de datos INFINITO y Nan, se convierte en literal.

Ejemplo,

import json
# pass float Infinite value
infinite_json = json.dumps(float('inf'))
# check infinite json type
print(infinite_json)
print(type(infinite_json))
json_nan = json.dumps(float('nan'))
print(json_nan)
# pass json_string as Infinity
infinite = json.loads('Infinity')
print(infinite)
# check type of Infinity
print(type(infinite))

Salida:

Infinity
<class 'str'>
NaN
inf
<class 'float'>	

Clave repetida en cadena JSON

RFC especifica que el nombre de la clave debe ser รบnico en un objeto JSON, pero no es obligatorio. Python La biblioteca JSON no genera una excepciรณn de objetos repetidos en JSON. Ignora todos los pares clave-valor repetidos y considera solo el รบltimo par clave-valor entre ellos.

  • Ejemplo,
import json
repeat_pair = '{"a":  1, "a":  2, "a":  3}'
json.loads(repeat_pair)

Salida:

{'a': 3}

CLI (Interfaz de lรญnea de comando) con JSON en Python

json.herramienta proporciona la interfaz de lรญnea de comandos para validar la sintaxis JSON de impresiรณn bonita. Veamos un ejemplo de CLI

Interfaz de lรญnea de comando con JSON

$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool

Salida:

{
    "name": " Kings Authur "
}

Ventajas de JSON en Python

  • Fรกcil de retroceder entre contenedor y valor (JSON a Python y Python a JSON)
  • Objeto JSON legible por humanos (bastante impreso)
  • Ampliamente utilizado en el manejo de datos.
  • No tiene la misma estructura de datos en un solo archivo.

Limitaciones de implementaciรณn de JSON en Python

  • En deserializador de rango JSON y predicciรณn de un nรบmero
  • La longitud mรกxima de la cadena JSON y las matrices de JSON y los niveles de anidamiento del objeto.

Python Hoja de referencia JSON

Python Funciรณn JSON Descripciรณn
json.dumps(persona_datos) Crear objeto JSON
json.dump(datos_persona, escritura_archivo) Cree un archivo JSON utilizando la E/S de archivos de Python
compact_obj = json.dumps(datos, separadores=(',',':')) Objeto JSON compacto eliminando el carรกcter de espacio del objeto JSON usando un separador
formatted_obj = json.dumps (dic, sangrรญa = 4, separadores = (',', ': ')) Formatear cรณdigo JSON usando sangrรญa
cadena_clasificada = json.dumps(x, sangrรญa=4, claves_clasificadas=Verdadero) Ordenar la clave de objeto JSON por orden alfabรฉtico
objeto_complejo = json.dumps(4 + 5j, predeterminado=codificaciรณn_compleja) Python Codificaciรณn de objetos complejos en JSON
JSONEncoder().codificar(color_dict) Uso de la clase JSONEncoder para serializaciรณn
json.loads(cadena_datos) Decodificando cadena JSON en Python diccionario usando la funciรณn json.loads()
json.loads('{โ€œ__complex__โ€: verdadero, โ€œrealโ€: 4, โ€œimgโ€: 5}', object_hook = is_complex) Decodificaciรณn de objetos JSON complejos a Python
JSONDecoder().decodificar(cadena_color) Uso de decodificaciรณn JSON para Python con deserializaciรณn

Resumir este post con: