JSON (JavaScript Object Notation) es un formato de datos ligero y ampliamente utilizado para el intercambio de datos. En F#, trabajar con JSON es una tarea común, especialmente cuando se desarrollan aplicaciones web o se interactúa con APIs. En esta sección, aprenderemos cómo serializar y deserializar JSON utilizando F#.

Contenidos

  1. Introducción a JSON
  2. Serialización de Datos a JSON
  3. Deserialización de JSON a Datos
  4. Ejemplos Prácticos
  5. Ejercicios

  1. Introducción a JSON

JSON es un formato de texto que es fácil de leer y escribir para los humanos y fácil de analizar y generar para las máquinas. Aquí hay un ejemplo de un objeto JSON:

{
  "nombre": "Juan",
  "edad": 30,
  "casado": true,
  "hijos": ["Ana", "Luis"],
  "direccion": {
    "calle": "Calle Falsa 123",
    "ciudad": "Springfield"
  }
}

  1. Serialización de Datos a JSON

La serialización es el proceso de convertir un objeto en una cadena JSON. En F#, podemos usar la biblioteca Newtonsoft.Json para este propósito. Primero, asegúrate de tener la biblioteca instalada:

dotnet add package Newtonsoft.Json

Ejemplo de Serialización

Supongamos que tenemos el siguiente tipo de registro en F#:

type Persona = {
    Nombre: string
    Edad: int
    Casado: bool
    Hijos: string list
    Direccion: Direccion
}

and Direccion = {
    Calle: string
    Ciudad: string
}

Podemos crear una instancia de Persona y serializarla a JSON de la siguiente manera:

open Newtonsoft.Json

let persona = {
    Nombre = "Juan"
    Edad = 30
    Casado = true
    Hijos = ["Ana"; "Luis"]
    Direccion = { Calle = "Calle Falsa 123"; Ciudad = "Springfield" }
}

let json = JsonConvert.SerializeObject(persona)
printfn "JSON: %s" json

Explicación del Código

  1. Definición de Tipos: Definimos los tipos Persona y Direccion.
  2. Creación de Instancia: Creamos una instancia de Persona.
  3. Serialización: Usamos JsonConvert.SerializeObject para convertir la instancia de Persona a una cadena JSON.
  4. Impresión: Imprimimos la cadena JSON resultante.

  1. Deserialización de JSON a Datos

La deserialización es el proceso de convertir una cadena JSON en un objeto. Usaremos nuevamente Newtonsoft.Json para este propósito.

Ejemplo de Deserialización

Supongamos que tenemos la siguiente cadena JSON:

{
  "Nombre": "Juan",
  "Edad": 30,
  "Casado": true,
  "Hijos": ["Ana", "Luis"],
  "Direccion": {
    "Calle": "Calle Falsa 123",
    "Ciudad": "Springfield"
  }
}

Podemos deserializar esta cadena a una instancia de Persona de la siguiente manera:

let json = """
{
  "Nombre": "Juan",
  "Edad": 30,
  "Casado": true,
  "Hijos": ["Ana", "Luis"],
  "Direccion": {
    "Calle": "Calle Falsa 123",
    "Ciudad": "Springfield"
  }
}
"""

let persona = JsonConvert.DeserializeObject<Persona>(json)
printfn "Nombre: %s, Edad: %d" persona.Nombre persona.Edad

Explicación del Código

  1. Cadena JSON: Definimos una cadena JSON.
  2. Deserialización: Usamos JsonConvert.DeserializeObject para convertir la cadena JSON en una instancia de Persona.
  3. Impresión: Imprimimos algunos campos de la instancia deserializada.

  1. Ejemplos Prácticos

Ejemplo 1: Serialización de una Lista de Personas

let personas = [
    { Nombre = "Juan"; Edad = 30; Casado = true; Hijos = ["Ana"; "Luis"]; Direccion = { Calle = "Calle Falsa 123"; Ciudad = "Springfield" } }
    { Nombre = "Maria"; Edad = 25; Casado = false; Hijos = []; Direccion = { Calle = "Avenida Siempre Viva 742"; Ciudad = "Springfield" } }
]

let json = JsonConvert.SerializeObject(personas)
printfn "JSON: %s" json

Ejemplo 2: Deserialización de una Lista de Personas

let json = """
[
  {
    "Nombre": "Juan",
    "Edad": 30,
    "Casado": true,
    "Hijos": ["Ana", "Luis"],
    "Direccion": {
      "Calle": "Calle Falsa 123",
      "Ciudad": "Springfield"
    }
  },
  {
    "Nombre": "Maria",
    "Edad": 25,
    "Casado": false,
    "Hijos": [],
    "Direccion": {
      "Calle": "Avenida Siempre Viva 742",
      "Ciudad": "Springfield"
    }
  }
]
"""

let personas = JsonConvert.DeserializeObject<Persona list>(json)
personas |> List.iter (fun p -> printfn "Nombre: %s, Edad: %d" p.Nombre p.Edad)

  1. Ejercicios

Ejercicio 1: Serializar y Deserializar un Objeto Complejo

  1. Define un tipo de registro Libro con los campos Titulo, Autor, Paginas y Publicado.
  2. Crea una instancia de Libro y serialízala a JSON.
  3. Deserializa la cadena JSON de vuelta a una instancia de Libro.

Solución

type Libro = {
    Titulo: string
    Autor: string
    Paginas: int
    Publicado: int
}

let libro = {
    Titulo = "El Quijote"
    Autor = "Miguel de Cervantes"
    Paginas = 1072
    Publicado = 1605
}

let json = JsonConvert.SerializeObject(libro)
printfn "JSON: %s" json

let libroDeserializado = JsonConvert.DeserializeObject<Libro>(json)
printfn "Titulo: %s, Autor: %s" libroDeserializado.Titulo libroDeserializado.Autor

Ejercicio 2: Trabajar con Listas de Objetos

  1. Define una lista de Libro.
  2. Serializa la lista a JSON.
  3. Deserializa la cadena JSON de vuelta a una lista de Libro.

Solución

let libros = [
    { Titulo = "El Quijote"; Autor = "Miguel de Cervantes"; Paginas = 1072; Publicado = 1605 }
    { Titulo = "Cien Años de Soledad"; Autor = "Gabriel García Márquez"; Paginas = 417; Publicado = 1967 }
]

let json = JsonConvert.SerializeObject(libros)
printfn "JSON: %s" json

let librosDeserializados = JsonConvert.DeserializeObject<Libro list>(json)
librosDeserializados |> List.iter (fun l -> printfn "Titulo: %s, Autor: %s" l.Titulo l.Autor)

Conclusión

En esta sección, hemos aprendido cómo trabajar con JSON en F#. Hemos cubierto la serialización y deserialización de datos, y hemos visto ejemplos prácticos para reforzar los conceptos. Ahora deberías estar cómodo trabajando con JSON en tus proyectos F#. En la próxima sección, exploraremos cómo interactuar con bases de datos en F#.

Curso de Programación en F#

Módulo 1: Introducción a F#

Módulo 2: Conceptos Básicos

Módulo 3: Programación Funcional

Módulo 4: Estructuras de Datos Avanzadas

Módulo 5: Programación Orientada a Objetos en F#

Módulo 6: Programación Asíncrona y Paralela

Módulo 7: Acceso y Manipulación de Datos

Módulo 8: Pruebas y Depuración

Módulo 9: Temas Avanzados

Módulo 10: Aplicaciones Prácticas

© Copyright 2024. Todos los derechos reservados