Saltar al contenido principal

JSON y Serialización

JSON es el formato de intercambio de datos más común. Así es como los diferentes lenguajes manejan el parseo y la serialización de JSON.

Parseo y Serialización de JSON​

// Parse JSON string to object
const data = JSON.parse('{"name":"John","age":30}');
console.log(data.name); // "John"

// Serialize object to JSON string
const json = JSON.stringify({ name: "John", age: 30 });
// '{"name":"John","age":30}'

// Pretty print
const pretty = JSON.stringify(data, null, 2);

// Custom serialization (replacer)
const json2 = JSON.stringify(data, (key, value) => {
if (key === "age") return undefined; // Exclude
return value;
});

// Parse with reviver
const data2 = JSON.parse(json, (key, value) => {
if (key === "date") return new Date(value);
return value;
});

// Fetch JSON from API
const response = await fetch('/api/data');
const apiData = await response.json();

Puntos Clave​

  • Soporte incorporado vs bibliotecas — JavaScript (JSON.parse/JSON.stringify), Python (módulo json), PHP (json_decode/json_encode) y Ruby (JSON.parse/to_json) incluyen JSON en la biblioteca estándar. Rust usa los crates serde + serde_json; Go usa encoding/json; C y C++ requieren bibliotecas externas como cJSON o nlohmann/json. Para APIs web y parseo de configuración, el soporte incorporado es conveniente; para trabajo embebido o de sistemas, ten en cuenta la dependencia y el tamaño del binario de las bibliotecas JSON.

  • Deserialización tipada — El serde de Rust mapea JSON a structs con #[derive(Deserialize)]; Go usa etiquetas de struct: type Person struct { Name string \json:"name"` }; el Codablede Swift y elSystem.Text.Jsonde C# hacen lo mismo. Cuando necesitas trabajar con estructura desconocida, usa tipos dinámicos:serde_json::Value, map[string]interface, JsonNodeoJsonDocument`. Prefiere deserialización tipada para APIs internas y configuraciones; usa parseo dinámico cuando el esquema es flexible o controlado externamente.

  • Patrones derive/Codable — El #[derive(Serialize, Deserialize)] de Rust, el Codable de Swift y los tipos record de C# habilitan serialización automática con mínimo código repetitivo. Defines el struct y obtienes ida y vuelta JSON gratis; la serialización personalizada usa implementaciones de Serialize/Deserialize o atributos como #[serde(rename = "first_name")]. Esto reduce el código repetitivo y mantiene el esquema y el código sincronizados. Para proyectos nuevos, prefiere lenguajes con fuerte soporte derive/Codable; evita el marshalling manual a menos que necesites lógica personalizada.

  • Serialización personalizada y casos especiales — El JSONEncoder de Python y el replacer/reviver de JavaScript permiten manejo personalizado de fechas, BigInt u otros tipos no-JSON. El encoding/json de Go requiere MarshalJSON/UnmarshalJSON personalizados para tipos no estándar. El serde de Rust soporta #[serde(serialize_with = "...")] para lógica personalizada. Cuando trabajes con fechas, decimales o tipos especiales, revisa las opciones de personalización de la biblioteca; JavaScript y Python ofrecen hooks flexibles, mientras que Go y Rust requieren implementaciones más explícitas.