¿Qué es JSON?
JSON es un formato estándar para el intercambio de datos, que está inspirado en JavaScript. Generalmente, JSON está en formato de cadena o texto. JSON son las siglas de J ava S cript O bject N otation.
La sintaxis de JSON: JSON se escribe como un par de clave y valor.
{"Key": "Value","Key": "Value",}
JSON es muy similar al diccionario Python. Python admite JSON y tiene una biblioteca incorporada como JSON.
Biblioteca JSON en Python
Los módulos externos ' marshal ' y ' pickle' de Python mantienen una versión de la biblioteca JSON . Para realizar operaciones relacionadas con JSON, como codificar y decodificar en Python, primero debe importar la biblioteca JSON y, para ello, en su archivo .py ,
import json
Los siguientes métodos están disponibles en el módulo JSON
Método | Descripción |
---|---|
deshecho() | codificación a objetos JSON |
vertedero() | escritura de cadena codificada en archivo |
cargas () | Decodificar la cadena JSON |
carga() | Decodificar mientras se lee el archivo JSON |
Python a JSON (codificación)
JSON Library of Python realiza la siguiente traducción de objetos Python en objetos JSON de forma predeterminada
Pitón | JSON |
dictar | Objeto |
lista | Formación |
Unicode | Cuerda |
número - int, largo | número - int |
flotador | número - real |
Cierto | Cierto |
Falso | Falso |
Ninguno | Nulo |
La conversión de datos de Python a JSON se denomina operación de codificación. La codificación se realiza con la ayuda del método de biblioteca JSON - dumps ()
El método dumps () convierte el objeto de diccionario de Python en formato de datos de cadena JSON.
Ahora vamos a realizar nuestro primer ejemplo de codificación con Python.
import jsonx = {"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)
Producción:
{"person": {"name": "Kenn", "sex": "male", "age": 28}})
Creemos un archivo JSON del diccionario usando la misma función dump ()
# here we create new data_file.json file with write mode using file i/o operationwith open('json_file.json', "w") as file_write:# write json data into filejson.dump(person_data, file_write)
Producción:
Nada que mostrar
... En su sistema json_file.json se crea, puede verificar ese archivo.JSON a Python (decodificación)
Decodificación cadena JSON se realiza con la ayuda de métodos incorporados cargas () y carga () de la biblioteca JSON en Python. Aquí, la tabla de traducción muestra un ejemplo de objetos JSON a objetos Python que son útiles para realizar la decodificación en Python de la cadena JSON.
JSON | Pitón |
Objeto | dictar |
Formación | lista |
Cuerda | Unicode |
número - int | número - int, largo |
número - real | flotador |
Cierto | Cierto |
Falso | Falso |
Nulo | Ninguno |
Veamos un ejemplo básico de decodificación en Python con la ayuda de la función json.loads () ,
import json # json library imported# json data stringperson_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_objprint("Type of dict_obj", type(dict_obj))# get human object detailsprint("Person… ", dict_obj.get('person'))
Producción:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}Type of dict_objPerson… {'name': 'John', 'sex': 'male'}
Decodificación de archivos JSON o análisis de archivos JSON en Python
NOTA: La decodificación de archivos JSON es una operación relacionada con la entrada / salida de archivos (E / S). El archivo JSON debe existir en su sistema en la ubicación especificada que menciona en su programa.
Ejemplo,
import json#File I/O Open function for read data from JSON Filewith open('X:/json_file.json') as file_object:# store file data in objectdata = json.load(file_object)print(data)
Aquí los datos son un objeto de diccionario de Python.
Producción:
{'person': {'name': 'Kenn', 'sex': 'male', 'age': 28}}
Codificación compacta en Python
Cuando necesite reducir el tamaño de su archivo JSON, puede usar la codificación compacta en Python.
Ejemplo,
import json# Create a List that contains dictionarylst = ['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 dictionarycompact_obj = json.dumps(lst, separators=(',', ':'))print(compact_obj)
Producción:
'["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 **
Formato de 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 jsondic = { '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)
Producción:
{"a" : 4,"b" : 5}
Para comprender mejor esto, cambie la sangría a 40 y observe el resultado:
Solicitando el código JSON:
El atributo sort_keys en el argumento de la función dumps () clasificará la clave en JSON en orden ascendente. El argumento sort_keys es un atributo booleano. Cuando es cierto, la clasificación está permitida, de lo contrario no
Ejemplo,
import jsonx = {"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)
Producción:
{"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, los coches, los niños, etc. están ordenados en orden ascendente.
Codificación de objetos complejos de Python
Un objeto complejo tiene dos partes diferentes que se
- Parte real
- Parte imaginaria
Ejemplo: 3 + 2i
Antes de realizar la codificación de un objeto complejo, debe verificar si una variable es compleja o no. Necesita crear una función que verifique el valor almacenado en una variable usando un método de instancia.
Creemos la función específica para comprobar que el objeto es complejo o apto para codificación.
import json# create function to check instance is complex or notdef complex_encode(object):# check using isinstance methodif isinstance(object, complex):return [object.real, object.imag]# raised error using exception handling if object is not complexraise TypeError(repr(object) + " is not JSON serialized")# perform json encoding by passing parametercomplex_obj = json.dumps(4 + 5j, default=complex_encode)print(complex_obj)
Producción:
'[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 compruebe que la cadena JSON contiene el objeto complejo o no. Ejemplo,
import json# function check JSON string contains complex objectdef 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 notcomplex_object =json.loads('{"__complex__": true, "real": 4, "img": 5}', object_hook = is_complex)#here we not passed complex object so it's convert into dictionarysimple_object =json.loads('{"real": 6, "img": 7}', object_hook = is_complex)print("Complex_object… ",complex_object)print("Without_complex_object… ",simple_object)
Producción:
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 objeto de Python mientras se realiza la codificación. Contiene tres métodos diferentes de codificación que son
- default (o) : implementado en la subclase y devuelve el objeto serializar para el objeto o .
- encode (o) : igual que el método json.dumps (), devuelve la cadena JSON de la estructura de datos de Python.
- iterencode (o) : representa la cadena una por una y codifica el objeto o.
Con la ayuda del método encode () de la clase JSONEncoder, también podemos codificar cualquier objeto Python.
# import JSONEncoder class from jsonfrom json.encoder import JSONEncodercolour_dict = { "colour": ["red", "yellow", "green" ]}# directly called encode method of JSONJSONEncoder().encode(colour_dict)
Producción:
'{"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 objeto de Python mientras se realiza la decodificación. Contiene tres métodos diferentes de decodificación que son
- default (o) - Implementado en la subclase y devuelve el objeto o objeto deserializado .
- decode (o) : igual que el método json.loads (), devuelve la estructura de datos de Python de una cadena o datos JSON.
- raw_decode (o) : representa el diccionario de Python uno por uno y decodifica el objeto o.
Con la ayuda del método decode () de la clase JSONDecoder, también podemos decodificar la cadena JSON.
import json# import JSONDecoder class from jsonfrom json.decoder import JSONDecodercolour_string = '{ "colour": ["red", "yellow"]}'# directly called decode method of JSONJSONDecoder().decode(colour_string)
Producción:
{'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://feeds.citibikenyc.com/stations/stations.json) y los convertiremos en formato de diccionario.
Ejemplo,
NOTA: - Asegúrese de que la biblioteca de solicitudes ya esté instalada en su Python. De lo contrario, abra Terminal o CMD y escriba
- (Para Python 3 o superior) solicitudes de instalación pip3
import jsonimport requests# get JSON string data from CityBike NYC using web requests libraryjson_response= requests.get("https://feeds.citibikenyc.com/stations/stations.json")# check type of json_response objectprint(type(json_response.text))# load data in loads() function of json librarybike_dict = json.loads(json_response.text)#check type of news_dictprint(type(bike_dict))# now get stationBeanList key data from dictprint(bike_dict['stationBeanList'][0])
Producción:
{'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:
- La clase json.JSONDecoderError maneja la excepción relacionada con la operación de decodificación. y es una subclase de ValueError.
- Excepción: json.JSONDecoderError (msg, doc)
- Los parámetros de excepción son,
- msg: mensaje de error sin formato
- doc: documentos JSON analizados
- pos - índice de inicio del documento cuando falla
- lineno - la línea no se muestra corresponde a pos
- dos puntos - la columna no corresponde a pos
Ejemplo,
import json#File I/O Open function for read data from JSON Filedata = {} #Define Empty Dictionary Objecttry:with open('json_file_name.json') as file_object:data = json.load(file_object)except ValueError:print("Bad JSON file format, Change JSON File")
Números infinitos y NaN en Python
El formato de intercambio de datos JSON (RFC - Request For Comments) no permite Infinite o Nan Value, pero no hay ninguna restricción en Python-JSON Library para realizar operaciones relacionadas con Infinite y Nan Value. Si JSON obtiene el tipo de datos INFINITE y Nan, entonces se convierte en literal.
Ejemplo,
import json# pass float Infinite valueinfinite_json = json.dumps(float('inf'))# check infinite json typeprint(infinite_json)print(type(infinite_json))json_nan = json.dumps(float('nan'))print(json_nan)# pass json_string as Infinityinfinite = json.loads('Infinity')print(infinite)# check type of Infinityprint(type(infinite))
Producción:
InfinityNaNinf
Clave repetida en JSON String
RFC especifica que el nombre de la clave debe ser único en un objeto JSON, pero no es obligatorio. La biblioteca Python JSON no genera una excepción de objetos repetidos en JSON. Ignora todos los pares clave-valor repetidos y solo considera el último par clave-valor entre ellos.
- Ejemplo,
import jsonrepeat_pair = '{"a": 1, "a": 2, "a": 3}'json.loads(repeat_pair)
Producción:
{'a': 3}
CLI (interfaz de línea de comandos) con JSON en Python
json.tool proporciona la interfaz de línea de comandos para validar la sintaxis de impresión bonita de JSON. Veamos un ejemplo de CLI
$ echo '{"name" : "Kings Authur" }' | python3 -m json.tool
Producción:
{"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 (impresión bonita)
- Ampliamente utilizado en el manejo de datos.
- No tiene la misma estructura de datos en un solo archivo.
Limitación 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 anidación del objeto.
Código de trucos
json.dumps (person_data) |
Crear objeto JSON |
json.dump (datos_persona, escritura_archivo) |
Crear archivo JSON usando E / S de archivo 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 = (',', ':')) |
Formateo de código JSON usando Sangría |
sorted_string = json.dumps (x, sangría = 4, sort_keys = True) |
Clasificación de la clave de objeto JSON por orden alfabético |
complex_obj = json.dumps (4 + 5j, predeterminado = complex_encode) |
Codificación de objetos complejos de Python en JSON |
JSONEncoder (). Encode (colour_dict) |
Uso de la clase JSONEncoder para serialización |
json.loads (cadena_datos) |
Decodificando JSON String en el diccionario Python usando la función json.loads () |
json.loads ('{"__ complex__": true, "real": 4, "img": 5}', object_hook = is_complex) |
Decodificación de objetos JSON complejos a Python |
JSONDecoder (). Decode (cadena_colour) |
Uso de decodificación de JSON a Python con deserialización |