Introducción al trabajo con JSON en C#
JSON (JavaScript Object Notation) es un formato ligero de intercambio de datos que se utiliza ampliamente en aplicaciones web modernas, API y archivos de configuración. Para un desarrollador de C#, saber trabajar con JSON es una habilidad obligatoria, especialmente al crear clientes REST, microservicios o aplicaciones que interactúan con fuentes de datos externas.
En el ecosistema .NET existen dos enfoques principales para el procesamiento de JSON: la biblioteca clásica Newtonsoft.Json (también conocida como Json.NET) y la biblioteca moderna integrada System.Text.Json, que apareció en .NET Core 3.0 y se convirtió en el estándar en .NET 5+. Ambas bibliotecas permiten realizar dos operaciones clave: serialización (convertir un objeto de C# en una cadena JSON) y deserialización (convertir una cadena JSON de vuelta a un objeto de C#).
En este artículo, analizaremos en detalle ambos enfoques, aprenderemos a analizar estructuras de datos complejas y revisaremos las mejores prácticas para trabajar con JSON en C#.
1. Operaciones básicas: serialización y deserialización
1.1 Uso de Newtonsoft.Json (Json.NET)
Newtonsoft.Json ha sido el estándar de facto para trabajar con JSON en .NET durante muchos años. Para comenzar, instale el paquete a través de NuGet:
Install-Package Newtonsoft.JsonConsideremos una clase simple como ejemplo:
public class User{ public int Id { get; set; } public string Name { get; set; } public string Email { get; set; } public bool IsActive { get; set; }}Serialización de un objeto a JSON:
using Newtonsoft.Json;
User user = new User{ Id = 1, Name = "Iván Petrov", Email = "ivan@example.com", IsActive = true};
string json = JsonConvert.SerializeObject(user, Formatting.Indented);Console.WriteLine(json);Resultado de la ejecución:
{ "Id": 1, "Name": "Iván Petrov", "Email": "ivan@example.com", "IsActive": true}Deserialización de JSON de vuelta a un objeto:
string jsonString = @"{""Id"":1,""Name"":""Iván Petrov"",""Email"":""ivan@example.com"",""IsActive"":true}";User deserializedUser = JsonConvert.DeserializeObject<User>(jsonString);Console.WriteLine($"Usuario: {deserializedUser.Name}, Email: {deserializedUser.Email}");1.2 Uso de System.Text.Json
A partir de .NET Core 3.0, Microsoft presentó su propia biblioteca System.Text.Json, que está optimizada en rendimiento y no requiere dependencias externas.
Serialización:
using System.Text.Json;
User user = new User{ Id = 2, Name = "María Smirnova", Email = "maria@example.com", IsActive = false};
string json = JsonSerializer.Serialize(user, new JsonSerializerOptions { WriteIndented = true });Console.WriteLine(json);Deserialización:
string jsonString = @"{""Id"":2,""Name"":""María Smirnova"",""Email"":""maria@example.com"",""IsActive"":false}";User deserializedUser = JsonSerializer.Deserialize<User>(jsonString);Console.WriteLine($"Usuario: {deserializedUser.Name}");2. Trabajo con estructuras de datos complejas
2.1 Objetos anidados y colecciones
JSON a menudo contiene estructuras anidadas. Consideremos un ejemplo con un array de pedidos de un usuario:
public class Order{ public int OrderId { get; set; } public decimal Amount { get; set; } public List<string> Items { get; set; }}
public class Customer{ public int CustomerId { get; set; } public string FullName { get; set; } public List<Order> Orders { get; set; }}Deserialización de JSON complejo