Saltar al contenido

Python JSON: Codificar (volcar), Decodificar (cargar) Datos y Archivo json (Ejemplo)

diciembre 8, 2019

¿Qué es JSON?

JSON es un formato estándar para el intercambio de datos, inspirado en JavaScript. Generalmente, JSON está en formato de cadena o de texto. JSON significa J ava S cript O bject N otation.

La sintaxis de JSON: JSON se escribe como par de claves y valores.

>

JSON es muy similar al diccionario Python. Python soporta JSON, y tiene una librería incorporada como JSON.

Biblioteca JSON en Python

marshal $0027 y $0027 pickle$0027 módulos externos de Python mantienen una versión de la biblioteca JSON . Para realizar operaciones relacionadas con JSON como la codificación y decodificación en Python es necesario primero importar la biblioteca JSON y para ello en su archivo .py ,

importar json

>

Los siguientes métodos están disponibles en el módulo JSON

Method Description dumps() encoding to JSON objects dump() encoded string writing on file loads() Decode the JSON string load() Decode while JSON file read What You Will Learn: [hide]

  • ¿Qué es JSON?
  • Biblioteca JSON en Python
  • De Python a JSON (Codificación)
  • JSON a Python (Decodificación)
    • Decodificación de archivos JSON o análisis de archivos JSON en Python
    • Codificación compacta en Python
    • Formatear el código JSON (Pretty print)
  • Codificación de objetos complejos de Python
  • Decodificación compleja de objetos JSON en Python
  • Descripción general de la clase de serialización de JSON JSONEncoder
  • Descripción general de JSON Deserialization class JSONDecoder
    • Decodificación de datos JSON a partir de una URL: Ejemplo de la vida real.
  • Excepciones relacionadas con la biblioteca JSON en Python
  • Números infinitos y NaN en Python
  • Tecla repetida en JSON String
  • CLI (Command Line Interface) con JSON en Python
  • Ventajas de JSON en Python
  • Limitación de implementación de JSON en Python
  • Código de trampa

De Python a JSON (Codificación)

La librería JSON de Python realiza la siguiente traducción de objetos Python a objetos JSON por defecto

Python JSON dictar lista de objetos Array unicode String number – int, long number – int float number – real True True True False None Null

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 la biblioteca JSON – dumps()

dumps() convierte el objeto de diccionario de python al formato de datos de cadena JSON.

Ahora vamos a realizar nuestro primer ejemplo de codificación con Python.

importar json
x = {
  "nombre": "Ken",
  "edad": 45,
  "casados": Cierto,
  "niños": ("Alice", "Bob"),
  "mascotas": [$0027Perro$0027],
  "coches": [
    "Modelo": "Audi A1", "mpg": 15.1},
    "Modelo": "Zeep Compass", "mpg": 18.1}
  ]
}
# ordenando el resultado en orden de las llaves:
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)

>

Salida:

{«persona»: {«nombre»}: «Kenn», «sexo»: «varón», «edad»: 28}})
>

Vamos a crear un archivo JSON del diccionario usando la misma función dump()

# aquí creamos un nuevo archivo data_file.json con modo de escritura usando la operación de entrada/salida de archivos.
con open($0027json_file.json$0027, «w») como file_write:
# escriba los datos de json en un archivo
json.dump(person_data, file_write)
>

Salida:

No hay nada que mostrar…En su sistema se crea json_file.json puede comprobar ese archivo.

JSON a Python (Decodificación)

La decodificación de cadenas JSON se realiza con la ayuda del método incorporado loads() y load() de la librería 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 una cadena JSON.

JSON Python Object dic Array list String unicode number – int number – int, long number – real float True True True False Null None

Veamos un ejemplo básico de decodificación en Python con la ayuda de la función json.loads() ,

importar json # biblioteca json importada
# cadena de datos json
datos_de_persona = $0027{ "persona":  {"nombre":  "Kenn", "sexo":  "varón", "edad":  28}}$0027
# Decodificando o convirtiendo el formato JSON en el diccionario usando loads()
dic_obj = json.loads(person_data)
print(dic_obj)
# check type of dict_obj
print("Tipo de dic_obj", type(dict_obj))
# Obtener detalles de objetos humanos
print("Persona........", dic_obj.get($0027persona$0027))

>

Salida:

{$0027persona$0027: {$0027nombre$0027: $0027Kenn$0027, $0027sexo$0027: $0027hombre$0027, $0027edad$0027: 28}}
Tipo de dict_obj <class $0027dict$0027>
Persona........... {$0027nombre$0027: $0027John$0027, $0027sexo$0027: $0027masculino$0027}

>

Decodificación de archivos JSON o análisis de archivos JSON en Python

NOTA: El archivo JSON de decodificación 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 usted menciona en su programa.

Ejemplo,

importar json
#File I/O Función de apertura para la lectura de datos de JSON File
con open($0027X:/json_file.json$0027) como file_object:
        # Guardar los datos del archivo en el objeto
        data = json.load(file_object)
imprimir(datos)

>

Aquí los datos son un objeto de diccionario de Python.

Salida:

{$0027persona$0027: {$0027nombre$0027: $0027Kenn$0027, $0027sexo$0027: $0027hombre$0027, $0027edad$0027: 28}

Codificación compacta en Python

Cuando necesite reducir el tamaño de su archivo JSON, puede utilizar codificación compacta en Python.

Ejemplo,

importar json
# Crear una lista que contenga el diccionario
lst = [$0027a$0027, $0027b$0027, $0027c$0027,{$00274$0027: 5, $00276$0027: 7}]
# separador utilizado para la representación compacta de JSON.
# Uso de $0027,$0027 para identificar los ítems de la lista
# Uso de $0027:$0027 para identificar la clave y el valor en el diccionario
compact_obj = json.dumps(lst, separators=($0027,$0027,$0027, $0027:$0027)))
print(compact_obj)

>

Salida:

$0027["a", "b", "c", {"4": 5, "6": 7}]".
** Aquí la salida de JSON se representa en una sola línea, que es la representación más compacta, eliminando el carácter de espacio de compact_obj ** 

>.

Formatear el código JSON (Pretty print)

  • El objetivo es escribir un código bien formateado para la comprensión humana. Con la ayuda de la impresión bonita, cualquiera puede entender fácilmente el código.
  • Ejemplo,
importar json
dic = { $0027a$0027: 4, $0027b$0027: 5 }
$0027$0027$0027 Para formatear el código, el uso de guión y 4 muestra el número de espacio y el uso del separador no es necesario, sino la forma estándar de escribir el código de función particular. $0027$0027$0027
formatted_obj = json.dumps(dic, indent=4, separators=($0027,$0027,$0027, $0027: $0027)))
print(formatted_obj)

>

Salida:

>

Para entender mejor esto, cambie la sangría a 40 y observe la salida-

Pedido del código JSON:

sort_keys en dumps() ordenará la clave en JSON en orden ascendente. El argumento sort_keys es un atributo booleano. Cuando la clasificación es verdadera está permitida, de lo contrario no se permite

Ejemplo,

importar json
x = {
  "nombre": "Ken",
  "edad": 45,
  "casados": Cierto,
  "niños": ("Alice", "Bob"),
  "mascotas": "Perro",
  "coches": [
    "Modelo": "Audi A1", "mpg": 15.1},
    "Modelo": "Zeep Compass", "mpg": 18.1}
  	],
}
# ordenando el resultado en orden de las llaves:
sorted_string = json.dumps(x, indent=4, sort_keys=True)
print(sorted_string)

>

Salida:

>

Como puede observar la edad de las llaves, los coches, los niños, etc. están dispuestos en orden ascendente.

Codificación de objetos complejos de Python

Un objeto Complejo tiene dos partes diferentes que son

  1. Pieza real
  2. Parte imaginaria

Ejemplo: 3 +2i

Antes de realizar la codificación de un objeto complejo, es necesario comprobar si una variable es compleja o no. Es necesario crear una función que verifique el valor almacenado en una variable utilizando un método de instancia.

Vamos a crear la función específica para comprobar que el objeto es complejo o elegible para la codificación.

importar json
# crear una función para comprobar si la instancia es compleja o no
def complex_encode(object):
    # check usando el método isinstance
    si se trata de un objeto (objeto, complejo):
        return[object.real, object.imag]
    # error elevado usando el manejo de excepciones si el objeto no es complejo
    raise TypeError(repr(object) + " no es JSON serialized")
# Realizar la codificación json pasando el parámetro
complex_obj = json.dumps(4 + 5j, default=complex_encode)
print(complex_obj)

>

Salida:

$0027[4.0, 5.0]$0027

Decodificación compleja de objetos JSON en Python

Para decodificar un objeto complejo en JSON, utilice un parámetro object_hook que compruebe si la cadena JSON contiene o no el objeto complejo. Ejemplo,

importar json
  # verificación de función La cadena JSON contiene un objeto complejo
  def is_complex(objct):
    si $0027__complex__$0027 en el objeto:
      return complex(objct[$0027real$0027], objct[$0027img$0027])
    objeto de restitución
  # uso del método json loads con object_hook para comprobar el complejo de objetos o no
  complex_object =json.loads($0027{"__complex__": true, "real": 4, "img": 5}$0027, object_hook = is_complex)
  # aquí no pasamos objeto complejo para que se convierta en diccionario
  simple_object =json.loads($0027{"real": 6, "img": 7}$0027, object_hook = is_complex)
  print("Objeto_complejo........",Objeto_complejo)
  print("Sin_objeto_complejo.......",objeto_simple)

>

Salida:

Objeto_complejo…………………………………………………………………….. (4+5j)
Sin_objeto_complejo………. {$0027real$0027: 6, $0027img$0027: 7}
>

Descripción general de la clase de serialización de JSON JSONEncoder

La clase JSONEncoder se utiliza para la serialización de cualquier objeto 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 un objeto serializado para o objeto.
  • 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.

# importar la clase de JSONEncoder desde json
desde json.encoder importar JSONEncoder
color_dict = { «color»: «rojo», «amarillo», «verde» ]}
# directamente llamado método de codificación de JSON
JSONEncoder().encode(color_dict)
>

Salida:

$0027{"color": ["rojo", "amarillo", "verde"]}$0027

Descripción general de JSON Deserialization class JSONDecoder

La clase JSONDecoder se utiliza para la deserialización de cualquier objeto 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 deserializado o .
  • decode(o) – Igual que el método json.loads() devuelve la estructura de datos de Python de la cadena o datos JSON.
  • raw_decode(o) – Representar el diccionario Python 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.

importar json
# importar la clase JSONDecodificador desde json
desde json.decoder import JSONDecoder
color_string = $0027{ "color": ["rojo", "amarillo"]}$0027.
# directamente llamado método de decodificación de JSON
JSONDecoder().decode(color_string)

>

Salida:

{$0027color$0027: [$0027rojo$0027, $0027amarillo$0027]}

Decodificación de datos JSON a partir de una URL: Ejemplo de la vida real

Obtendremos los datos de CityBike NYC (Bike Sharing System) de la URL especificada (https://feeds.citibikenyc.com/stations/stations.json) y los convertiremos al formato de diccionario.

Ejemplo,

NOTA:- Asegúrese de que la biblioteca de peticiones ya está instalada en su Python, si no, abra Terminal o CMD y escriba

  • (Para Python 3 o superior) pip3 install requests
importar json
solicitudes de importación
# obtener los datos de las cadenas JSON de CityBike NYC usando la biblioteca de peticiones web
json_response= requests.get("https://feeds.citibikenyc.com/stations/stations.json")
# comprobar el tipo de objeto json_response
print(type(json_response.text))
# función load data in loads() de la librería json
bike_dict = json.loads(json_response.text)
#check type of news_dict
print(type(bike_dict))
# ahora obtiene stationBeanList datos clave de dict
print(bike_dict[$0027stationBeanList$0027][0])

>

Salida:

<class $0027str$0027>
<class `dict$0027>
{
	id$0027: 487,
 	Nombre de estación: E 20 St & FDR Drive,
	availableDocks": 24,
	totalDocks": 34,
	latitud": 40,7331414259,
	longitud": -73,97573881,
	statusValue$0027: En servicio$0027,
	statusKey": 1,
	availableBikes": 9,
	"Dirección 1": "E 20 St & FDR Drive",
	Dirección 2$0027: $0027$0027,
	ciudad": $0027$0027,
	"postalCode": $0027$0027,
	"Localización": $0027$0027,
	"Altitud": "Altitud",
	Estación de prueba": Falso,
	"Última hora de comunicación": 2018-12-11 10:59:09 PM, "landMark": $0027$0027.
}

>

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 ValueError.
  • Excepción – json.JSONDecoderError(msg, doc)
  • Los parámetros de excepción son,

    • msg – Mensaje de error sin formato
    • doc – JSON docs analizado
    • pos – inicia el índice de inicio de doc cuando falla
    • lineno – line no shows correspond to pos
    • dos puntos – columna no corresponde a pos

Ejemplo,

importar json
#File I/O Función de apertura para la lectura de datos de JSON File
data = {} #Definir objeto de diccionario vacío
Inténtalo:
        con open($0027json_file_name.json$0027) como file_object:
                data = json.load(file_object)
excepto ValueError:
     print("Formato de archivo JSON malo, Cambiar archivo JSON")

>

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 restricciones en la librería Python- JSON para realizar operaciones relacionadas con Infinite y Nan Value. Si JSON obtiene un tipo de datos INFINITO y Nan, entonces lo convierte en literal.

Ejemplo,

importar json
# pass float Infinite value
infinite_json = json.dumps(float($0027inf$0027))
# comprueba el tipo infinito de json
print(infinite_json)
print(type(infinite_json))
json_nanan = json.dumps(float($0027nan$0027))
imprimir(json_nan)
# Pasa json_string como Infinito
infinite = json.loads($0027Infinity$0027)
print(infinito)
# marque el tipo de Infinito
print(tipo(infinito))

>

Salida:

Infinito
<class $0027str$0027>
NaN
infra
<class $0027float$0027>
>

Tecla repetida en JSON String

RFC especifica que el nombre de la clave debe ser unívoco en un objeto JSON, pero no es obligatorio. La biblioteca Python JSON no plantea una excepción de objetos repetidos en JSON. Ignora todos los pares clave-valor repetidos y considera sólo el último par clave-valor entre ellos.

  • Ejemplo,
importar json
repeat_pair = $0027{"a":  1, "a":  2, "a":  3}$0027
json.loads(repeat_pair)

>

Salida:

{$0027a$0027: 3}

CLI (Command Line Interface) con JSON en Python

json.tool proporciona la interfaz de línea de comandos para validar la sintaxis JSON pretty-print. Veamos un ejemplo de CLI

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

Salida:

>

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 (Pretty-print)
  • 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 el deserializador del rango de JSON y predicción de un número
  • La longitud máxima de las cadenas y matrices de JSON y los niveles de anidamiento de los objetos.

Código de trampa

json.dumps(datos_de_personas)

Crear un objeto JSON

json.dump(person_data, file_write)

Crear un archivo JSON utilizando la E/S de archivo de Python

compact_obj = json.dumps(datos, separators=($0027,$0027,$0027,$0027:$0027)))

Compactar JSON Object eliminando el carácter de espacio de JSON Object utilizando el separador

formatted_obj = json.dumps(dic, indent=4, separators=($0027,$0027,$0027, $0027: $0027)))

Formateo de código JSON usando Indent

sorted_string = json.dumps(x, indent=4, sort_keys=True)

Clasificación de la clave de objeto JSON por orden alfabético

complex_obj = json.dumps(4 + 5j, default=complex_encode)

Codificación de objetos complejos Python en JSON

JSONEncoder().encode(color_dict)

Uso de la Clase JSONEncoder para Serialización

json.loads(data_string)

Decodificación de la cadena JSON en el diccionario Python usando la función json.loads()

json.loads($0027{«__complex__»: true, «real»: 4, «img»: 5}$0027, object_hook = is_complex)

Decodificación de un objeto JSON complejo a Python

JSONDecoder().decode(color_string)

Uso de la decodificación de JSON a Python con deserialización