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
- Introducción a JSON
- Serialización de Datos a JSON
- Deserialización de JSON a Datos
- Ejemplos Prácticos
- Ejercicios
- 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"
}
}
- 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:
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" jsonExplicación del Código
- Definición de Tipos: Definimos los tipos
PersonayDireccion. - Creación de Instancia: Creamos una instancia de
Persona. - Serialización: Usamos
JsonConvert.SerializeObjectpara convertir la instancia dePersonaa una cadena JSON. - Impresión: Imprimimos la cadena JSON resultante.
- 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.EdadExplicación del Código
- Cadena JSON: Definimos una cadena JSON.
- Deserialización: Usamos
JsonConvert.DeserializeObjectpara convertir la cadena JSON en una instancia dePersona. - Impresión: Imprimimos algunos campos de la instancia deserializada.
- 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" jsonEjemplo 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)
- Ejercicios
Ejercicio 1: Serializar y Deserializar un Objeto Complejo
- Define un tipo de registro
Librocon los camposTitulo,Autor,PaginasyPublicado. - Crea una instancia de
Libroy serialízala a JSON. - 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.AutorEjercicio 2: Trabajar con Listas de Objetos
- Define una lista de
Libro. - Serializa la lista a JSON.
- 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
- Tipos de Datos y Variables
- Funciones e Inmutabilidad
- Coincidencia de Patrones
- Colecciones: Listas, Arreglos y Secuencias
Módulo 3: Programación Funcional
- Funciones de Orden Superior
- Recursión
- Encadenamiento y Composición
- Aplicación Parcial y Currificación
Módulo 4: Estructuras de Datos Avanzadas
Módulo 5: Programación Orientada a Objetos en F#
- Clases y Objetos
- Herencia e Interfaces
- Mezclando Programación Funcional y Orientada a Objetos
- Módulos y Espacios de Nombres
Módulo 6: Programación Asíncrona y Paralela
- Flujos de Trabajo Asíncronos
- Biblioteca de Tareas Paralelas
- MailboxProcessor y Agentes
- Patrones de Concurrencia
Módulo 7: Acceso y Manipulación de Datos
Módulo 8: Pruebas y Depuración
- Pruebas Unitarias con NUnit
- Pruebas Basadas en Propiedades con FsCheck
- Técnicas de Depuración
- Perfilado de Rendimiento
