1. JSON

JSON (JavaScript Object Notation) es un formato de texto sencillo y ligero para el intercambio de datos, los últimos años ha tendido a reemplazar como alternativa a XML por varias razones: resulta mucho más sencillo escribir un analizador sintáctico (parser) patra JSON, es más ligero que XML ya que no debemos delimitar la información entre etiquetas de apertura y cierre.

Sintaxis JSON Vs XML:

Los tipos de datos disponibles con JSON son:

RealPython Working With JSON Data in Python

  • Números: Se permiten números negativos y opcionalmente pueden contener parte fraccional separada por puntos. Ejemplo: 123.456
  • Cadenas: Representan secuencias de cero o más caracteres. Se ponen entre doble comilla y se permiten cadenas de escape. Ejemplo: “Hola”
  • Booleanos: Representan valores booleanos y pueden tener dos valores: true y false
  • null: Representan el valor nulo.
  • Array: Representa una lista ordenada de cero o más valores los cuales pueden ser de cualquier tipo. Los valores se separan por comas y el vector se mete entre corchetes. Ejemplo [“juan”,“pedro”,“jacinto”]
  • Objetos: Son colecciones no ordenadas de pares de la forma : separados por comas y puestas entre llaves. El nombre tiene que ser una cadena entre comillas dobles.

Ejemplo:

{
  "departamento":8,
  "nombredepto":"Ventas",
  "director": "Juan Rodríguez",
  "empleados":[
    {
      "nombre":"Pedro",
      "apellido":"Fernández"
    },{
      "nombre":"Jacinto",
      "apellido":"Benavente"
    } 
  ]
}

2. Primer ejemplo

src/person.py

import json

# definicion JSON
x =  '{ "name":"John", "age":30, "city":"New York"}'

# parseamos X
y = json.loads(x)

# el resultado es un diccionario 
print(y["age"])

Este código utiliza el módulo json en Python para trabajar con datos en formato JSON. A continuación se explica paso a paso:

Importar el módulo json

import json

Este módulo permite convertir datos JSON a objetos de Python y viceversa. JSON (JavaScript Object Notation) es un formato de texto muy utilizado para intercambiar datos, especialmente entre servidores y aplicaciones web.

Definir un string en formato JSON

x =  '{ "name":"John", "age":30, "city":"New York"}'

Aquí, x es una cadena de texto que representa un objeto JSON. En este caso, el objeto JSON tiene tres pares clave-valor:

  • "name": "John"
  • "age": 30
  • "city": "New York"

Convertir (parsear) el JSON en un diccionario de Python

y = json.loads(x)

El método json.loads() convierte (o parsea) el string en formato JSON (x) a un diccionario de Python.

  • El resultado de esta operación se almacena en la variable y, que será un diccionario con las claves name, age, y city correspondientes a los valores “John”, 30 y “New York”.

Acceder a un valor en el diccionario

print(y["age"])

3. Convertir un diccionario en JSON

# Ejemplo de diccionario
persona = {
    "nombre": "Juan",
    "edad": 30,
    "ciudad": "Madrid",
    "profesiones": ["ingeniero", "programador"],
    "soltero": True
}

Para convertir un diccionario de Python a JSON, usamos el método json.dumps() (abreviatura de “dump string”). Esto genera un string en formato JSON a partir de un objeto de Python.

# Convertir el diccionario a JSON
persona_json = json.dumps(persona)

print(persona_json)

Salida esperada:

{"nombre": "Juan", "edad": 30, "ciudad": "Madrid", "profesiones": ["ingeniero", "programador"], "soltero": true}

Ejemplo:src/person2json.py

import json

# diccionario JSON
x = {
  "name": "John",
  "age": 30,
  "city": "New York"
}

# convertimos en JSON
y = json.dumps(x)

# El resultado es una cadena con formato JSON
print(y) 

3.1. Convertir a un JSON más legible (formato con sangría)

Por defecto, json.dumps() devuelve una cadena JSON en una sola línea (sin espacios ni saltos de línea). Sin embargo, para mejorar la legibilidad, podemos agregar la opción indent para añadir sangrías.

# Convertir el diccionario a JSON con formato legible
persona_json_legible = json.dumps(persona, indent=4)

print(persona_json_legible)

Salida esperada:

{
    "nombre": "Juan",
    "edad": 30,
    "ciudad": "Madrid",
    "profesiones": [
        "ingeniero",
        "programador"
    ],
    "soltero": true
}

3.2. Opciones adicionales para json.dumps()

Además de indent, hay otras opciones que podemos usar para personalizar la conversión:

  • separators: Permite definir los caracteres que separan elementos dentro del JSON

Ejemplo:

persona_json_separators = json.dumps(persona, separators=(',', ': '))
print(persona_json_separators)
  • sort_keys: Si se establece en True, las claves del diccionario se ordenarán alfabéticamente en el JSON generado.

Ejemplo:

persona_json_ordenado = json.dumps(persona, sort_keys=True, indent=4)
print(persona_json_ordenado)

Salida esperada con sort_keys=True:

{
    "ciudad": "Madrid",
    "edad": 30,
    "nombre": "Juan",
    "profesiones": [
        "ingeniero",
        "programador"
    ],
    "soltero": true
}

4. Guardar el JSON en un archivo

Si quieres escribir el JSON en un archivo en lugar de mostrarlo en la consola, puedes usar el método json.dump(). Esto escribirá el JSON directamente en un archivo.

# Guardar el JSON en un archivo
with open('persona.json', 'w') as archivo_json:
    json.dump(persona, archivo_json, indent=4)

5. Conversion de objetos Python en cadenas JSON

Puedes convertir los siguientes tipos de objetos en cadenas JSON:

  • dict
  • list
  • tuple
  • string
  • int
  • float
  • True
  • False
  • None

src/pyobjs2jsonstr.py

import json

print(json.dumps({"name": "John", "age": 30}))
print(json.dumps(["apple", "bananas"]))
print(json.dumps(("apple", "bananas")))
print(json.dumps("hello"))
print(json.dumps(42))
print(json.dumps(31.76))
print(json.dumps(True))
print(json.dumps(False))
print(json.dumps(None)) 

Ejemplo de conversión de un objeto en Python que contiene todos los tipos de datos permitidos:

src/pythonall.py

import json

x = {
  "name": "John",
  "age": 30,
  "married": True,
  "divorced": False,
  "children": ("Ann","Billy"),
  "pets": None,
  "cars": [
    {"model": "BMW 230", "mpg": 27.5},
    {"model": "Ford Edge", "mpg": 24.1}
  ]
}

print(json.dumps(x))

5.1. Formateando el resultado

Los ejemplos de arriba imprimen una cadena en formato JSON, pero resulta dificil de leer, sin saltos de línea o sangrías. El método json.dumps() tiene parámetros adicionales para facilitar la lectura del resultado.

import json

x = {
  "name": "John",
  "age": 30,
  "married": True,
  "divorced": False,
  "children": ("Ann","Billy"),
  "pets": None,
  "cars": [
    {"model": "BMW 230", "mpg": 27.5},
    {"model": "Ford Edge", "mpg": 24.1}
  ]
}

# use four indents to make it easier to read the result:
print(json.dumps(x, indent=4))

También podemos definir los separadores, por defecto son “,” y “:“.

import json

x = {
  "name": "John",
  "age": 30,
  "married": True,
  "divorced": False,
  "children": ("Ann","Billy"),
  "pets": None,
  "cars": [
    {"model": "BMW 230", "mpg": 27.5},
    {"model": "Ford Edge", "mpg": 24.1}
  ]
}

# use . and a space to separate objects, and a space, a = and a space to separate keys from their values:
print(json.dumps(x, indent=4, separators=(". ", " = ")))

5.2. Ordenar el resultado

El método json.dumps() tiene parámetros para ordenar las claves en el resultado:

Ejemplo

Use el parámetro sort_keys para especificar si el resultado debe ordenarse o no:

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

6. Convertir tipos de datos no serializables

No todos los tipos de datos de Python son serializables en JSON por defecto. Por ejemplo, los objetos de tipos personalizados o estructuras de datos complejas no pueden convertirse directamente a JSON. Si necesitas serializar un tipo de dato no estándar, puedes definir tu propia función de serialización.

Por ejemplo, para serializar un objeto datetime:

import json
import datetime

# Crear un diccionario con una fecha
datos_con_fecha = {
    "evento": "Conferencia",
    "fecha": datetime.datetime.now()
}

# Definir una función para convertir objetos datetime a string
def convertir_a_string(objeto):
    if isinstance(objeto, datetime.datetime):
        return objeto.isoformat()

# Convertir el diccionario a JSON usando la función personalizada
datos_json = json.dumps(datos_con_fecha, default=convertir_a_string)

print(datos_json)

Salida esperada:

{"evento": "Conferencia", "fecha": "2024-10-21T18:15:12.123456"}

7. Anexos

7.1. Herramientas y aplicaciones en línea que permiten trabajar con archivos y datos en formato JSON

JSONLint

  • Descripción: Una herramienta sencilla pero poderosa para validar y formatear JSON. Detecta errores de sintaxis y proporciona sugerencias para corregirlos.
  • Funciones:
    • Validar archivos JSON.
    • Minificar o “prettify” JSON (es decir, hacerlo más legible con indentación).
  • Enlace: https://jsonlint.com/

JSON Editor Online

  • Descripción: Un editor en línea avanzado para trabajar con JSON. Ofrece una vista de árbol y una vista de texto, lo que facilita la edición de JSON de manera estructurada.
  • Funciones:
    • Editar JSON en formato de árbol o de texto.
    • Comparar dos documentos JSON.
    • Compartir o guardar los archivos JSON editados.
  • Enlace: https://jsoneditoronline.org/

Code Beautify - JSON Viewer

  • Descripción: Un visor y editor de JSON que permite ver y manipular JSON en formato de árbol, con opciones para convertir JSON a otros formatos.
  • Funciones:
    • Visor JSON con formato de árbol.
    • Validar y formatear JSON.
    • Convertir JSON a XML, CSV, TSV, y otros formatos.
  • Enlace: https://codebeautify.org/jsonviewer

JSON Formatter & Validator

  • Descripción: Esta herramienta ayuda a formatear y validar datos JSON. También puede minificar JSON para reducir el tamaño del archivo.
  • Funciones:
    • Formatear JSON en un estilo legible.
    • Minificar JSON.
    • Validar datos JSON para comprobar errores de sintaxis.
  • Enlace: https://jsonformatter.org/

Mockaroo

  • Descripción: Una herramienta útil para generar datos simulados en formato JSON. Se puede personalizar el tipo de datos (nombres, direcciones, correos electrónicos, etc.) para crear archivos JSON con datos de prueba.
  • Funciones:
    • Generar archivos JSON con datos simulados.
    • Configurar tipos de datos personalizados.
    • Exportar a JSON, CSV, SQL, y otros formatos.
  • Enlace: https://mockaroo.com/

JSONCompare

  • Descripción: Herramienta para comparar y diferenciar dos archivos o conjuntos de datos JSON. Muestra las diferencias de manera visual, resaltando los cambios en ambos archivos.
  • Funciones:
    • Comparar dos archivos JSON.
    • Resaltar las diferencias entre los datos.
    • Minificar y validar archivos JSON.
  • Enlace: https://jsoncompare.com/

Postman

  • Descripción: Aunque Postman es más conocido como una herramienta para probar APIs, también tiene potentes capacidades para trabajar con JSON. Puedes enviar peticiones y recibir respuestas en JSON, validarlas y analizarlas.
  • Funciones:
    • Enviar y recibir datos en formato JSON a través de APIs.
    • Validar y formatear respuestas JSON.
    • Probar endpoints de API y gestionar colecciones de APIs.
  • Enlace: https://www.postman.com/

Extensión para VS Code: JSON Tools

Online JSON Diff

  • Descripción: Esta herramienta en línea permite comparar dos archivos o cadenas JSON y muestra claramente las diferencias entre ellos.
  • Funciones:
    • Comparar dos archivos JSON.
    • Ver diferencias de manera clara (agregados, eliminados, modificados).
  • Enlace: https://www.jsondiff.com/

FreeFormatter JSON Tools

  • Descripción: FreeFormatter ofrece un conjunto completo de herramientas JSON que incluyen validación, minificación y conversión entre diferentes formatos (JSON, XML, CSV).
  • Funciones:
    • Validar y formatear JSON.
    • Convertir JSON a XML o CSV.
    • Minificar y embellecer JSON.
  • Enlace: https://www.freeformatter.com/json-formatter.html

Insomnia

  • Descripción: Similar a Postman, Insomnia es una herramienta para interactuar con APIs que utiliza datos en formato JSON, permitiendo probar, validar y gestionar respuestas JSON.
  • Funciones:
    • Enviar solicitudes HTTP con datos JSON.
    • Visualizar y validar respuestas en JSON.
    • Organizar y probar APIs REST.
  • Enlace: https://insomnia.rest/

8. Vídeos

JSON: 1 Crea JSON con Python 3

JSON: 2 Lee JSON con Python 3

Consumir servicio REST JSON con Python 3 | Tutorial

9. Referencias