Serialización y deserialización de objetos a JSON

1 ¿Qué es la serialización y deserialización?

Serialización: proceso de convertir un objeto de un lenguaje de programación (por ejemplo, una clase en Python o Java) a un formato de texto plano, en este caso JSON, para enviarlo o almacenarlo.

Deserialización: proceso inverso: convertir un JSON recibido en un objeto del lenguaje para poder manipularlo en el código.

👉 Podés pensar la serialización como “empaquetar” y la deserialización como “desempaquetar”.

Esquema conceptual

Objeto (Python, Java, JS, etc.)
       ── serialización ──▶ JSON (texto plano, formato de intercambio)
       ◀─ deserialización ── Objeto en el programa

2 ¿Por qué es importante en APIs REST?

En una API REST:

  • Cuando enviamos datos al servidor, necesitamos serializarlos a JSON para que el servidor los entienda.
  • Cuando recibimos datos del servidor, debemos deserializarlos para usarlos como objetos en nuestro programa.

👉 Sin serialización/deserialización no habría forma práctica de comunicar objetos entre sistemas en distintos lenguajes.

3 Ejemplo conceptual

Imaginemos un objeto Producto en un lenguaje de programación:

Producto {
  id: 1,
  nombre: "Notebook",
  precio: 1500.0
}

Serialización a JSON

{
  "id": 1,
  "nombre": "Notebook",
  "precio": 1500.0
}

Deserialización desde JSON
El JSON recibido del servidor se convierte otra vez en un objeto Producto dentro del programa.

4 Ejemplos en distintos lenguajes

A) Python

import json

# Objeto (diccionario)
producto = {
    "id": 1,
    "nombre": "Notebook",
    "precio": 1500.0
}

# Serialización (objeto → JSON)
json_str = json.dumps(producto, ensure_ascii=False, indent=4)
print("JSON generado:\n", json_str)

# Deserialización (JSON → objeto)
json_recibido = '{"id": 2, "nombre": "Tablet", "precio": 900.5}'
producto_obj = json.loads(json_recibido)
print("Objeto Python:", producto_obj["nombre"], producto_obj["precio"])

👉 json.dumps() convierte objeto a JSON. json.loads() convierte JSON a objeto (diccionario).

B) JavaScript

// Objeto JavaScript
const producto = {
  id: 1,
  nombre: "Notebook",
  precio: 1500.0
};

// Serialización (objeto → JSON)
const jsonStr = JSON.stringify(producto, null, 2);
console.log("JSON generado:\n", jsonStr);

// Deserialización (JSON → objeto)
const jsonRecibido = '{"id":2,"nombre":"Tablet","precio":900.5}';
const productoObj = JSON.parse(jsonRecibido);
console.log("Objeto JS:", productoObj.nombre, productoObj.precio);

👉 JSON.stringify() serializa. JSON.parse() deserializa. Referencia: MDN JSON.

C) Java (usando Jackson)

import com.fasterxml.jackson.databind.ObjectMapper;

class Producto {
    public int id;
    public String nombre;
    public double precio;
}

public class Main {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();

        // Objeto Java
        Producto producto = new Producto();
        producto.id = 1;
        producto.nombre = "Notebook";
        producto.precio = 1500.0;

        // Serialización (objeto → JSON)
        String jsonStr = mapper.writeValueAsString(producto);
        System.out.println("JSON generado:\n" + jsonStr);

        // Deserialización (JSON → objeto)
        String jsonRecibido = "{\"id\":2,\"nombre\":\"Tablet\",\"precio\":900.5}";
        Producto prod2 = mapper.readValue(jsonRecibido, Producto.class);
        System.out.println("Objeto Java: " + prod2.nombre + " $" + prod2.precio);
    }
}

👉 writeValueAsString() convierte objeto a JSON. readValue() convierte JSON a objeto. Librería: Jackson.

D) C# (.NET con System.Text.Json)

using System;
using System.Text.Json;

public class Producto {
    public int Id { get; set; }
    public string Nombre { get; set; }
    public double Precio { get; set; }
}

class Program {
    static void Main() {
        // Objeto C#
        Producto producto = new Producto { Id = 1, Nombre = "Notebook", Precio = 1500.0 };

        // Serialización (objeto → JSON)
        string jsonStr = JsonSerializer.Serialize(producto, new JsonSerializerOptions { WriteIndented = true });
        Console.WriteLine("JSON generado:\n" + jsonStr);

        // Deserialización (JSON → objeto)
        string jsonRecibido = "{\"Id\":2,\"Nombre\":\"Tablet\",\"Precio\":900.5}";
        Producto prod2 = JsonSerializer.Deserialize(jsonRecibido);
        Console.WriteLine($"Objeto C#: {prod2.Nombre} - {prod2.Precio}");
    }
}

👉 JsonSerializer.Serialize() serializa. JsonSerializer.Deserialize() deserializa. Docs: System.Text.Json.

5 Problemas comunes en la serialización

  • Campos faltantes o extra: si el JSON no tiene todos los atributos, algunos lenguajes lanzan error o ignoran valores.
  • Tipos incorrectos: "precio": "1500" (texto) en vez de 1500 (número).
  • Codificación de caracteres: es importante usar UTF‑8 para soportar acentos y caracteres especiales.
  • Estructuras anidadas complejas: listas dentro de objetos requieren una deserialización más cuidada.

6 Buenas prácticas

  • Validar siempre el JSON antes de procesarlo.
  • Documentar los campos obligatorios y opcionales.
  • Usar librerías estándar para serializar/deserializar (no reinventar la rueda).
  • Evitar depender del orden de los atributos en el JSON.
  • Manejar errores de forma clara:
{ "error": "Formato de JSON inválido" }

7 Conclusión del capítulo

Serialización = convertir objetos a JSON para enviar a la API.

Deserialización = convertir JSON recibido en objetos para manipular en el código.

Todos los lenguajes modernos tienen librerías que lo hacen automáticamente. Es la pieza que permite que un objeto en Python pueda comunicarse con un objeto en JavaScript a través de JSON.

👉 En resumen: sin serialización y deserialización, las APIs REST no podrían hablar el mismo idioma.