Introducción al trabajo con JSON en C#
\n\nJSON (JavaScript Object Notation) es un formato ligero de intercambio de datos ampliamente utilizado en desarrollo web, aplicaciones móviles y microservicios. Para un desarrollador de C#, saber trabajar con JSON es una habilidad obligatoria. En este artículo, analizaremos los fundamentos del análisis (deserialización) y la serialización de JSON utilizando el espacio de nombres moderno System.Text.Json, que forma parte de .NET Core 3.0 y versiones superiores, así como de .NET 5/6/7/8.
Veremos:
\n- \n
- Qué es la serialización y la deserialización \n
- Cómo convertir un objeto de C# en una cadena JSON \n
- Cómo leer JSON y convertirlo de nuevo en un objeto \n
- Trabajo con objetos anidados y colecciones \n
- Manejo de errores y configuración de la serialización \n
Todos los ejemplos de código están escritos para una aplicación de consola en C# (.NET 6+). Podrás copiarlos y ejecutarlos inmediatamente.
\n\n1. Fundamentos de la serialización: objeto → JSON
\n\nSerialización es el proceso de convertir un objeto (o estructura de datos) en una cadena en formato JSON. En C#, se utiliza la clase JsonSerializer del espacio de nombres System.Text.Json.
Creando un modelo simple
\n\nSupongamos que tenemos la clase Person:
public class Person\n{\n public string Name { get; set; }\n public int Age { get; set; }\n public string Email { get; set; }\n}\n\nSerialización del objeto
\n\nAhora creemos una instancia y la convertimos a JSON:
\n\nusing System.Text.Json;\n\nPerson person = new Person\n{\n Name = "Iván Petrov",\n Age = 30,\n Email = "ivan@example.com"\n};\n\nstring jsonString = JsonSerializer.Serialize(person);\nConsole.WriteLine(jsonString);\n\nResultado:
\n\n{"Name":"Iván Petrov","Age":30,"Email":"ivan@example.com"}\n\nPor defecto, JsonSerializer usa camelCase para los nombres de las propiedades (primera letra en minúscula), pero en nuestro ejemplo los nombres se mantuvieron con mayúscula inicial porque no cambiamos la configuración. Si necesitas un camelCase estricto, usa JsonSerializerOptions:
var options = new JsonSerializerOptions\n{\n PropertyNamingPolicy = JsonNamingPolicy.CamelCase\n};\nstring jsonCamelCase = JsonSerializer.Serialize(person, options);\nConsole.WriteLine(jsonCamelCase);\n// {"name":"Iván Petrov","age":30,"email":"ivan@example.com"}\n\n2. Deserialización: JSON → objeto
\n\nDeserialización es el proceso inverso: tomamos una cadena JSON y la convertimos en un objeto de C#.
\n\nEjemplo simple de deserialización
\n\nSupongamos que recibimos un JSON de una API:
\n\nstring jsonFromApi = @"{""Name"":""Ana Smirnova"",""Age"":25,""Email"":""anna@test.com""}";\n\nPerson? personFromJson = JsonSerializer.Deserialize<Person>(jsonFromApi);\n\nif (personFromJson != null)\n{\n Console.WriteLine($"Nombre: {personFromJson.Name}, Edad: {personFromJson.Age}");\n}\n\nObserva el signo ? después del tipo Person — es una anotación nullable que indica que el resultado puede ser null (por ejemplo, si el JSON es incorrecto).
Trabajo con arreglos y listas
\n\nA menudo, el JSON contiene colecciones de objetos. Supongamos que tenemos un arreglo de usuarios:
\n\nstring jsonArray = @"\n[\n {""Name"":""Oleg"",""Age"":35},\n {""Name"":""María"",""Age"":28},\n {""Name"":""Dmitri"",""Age"":42}\n]";\n\nList<Person>? people = JsonSerializer.Deserialize<List<Person>>(jsonArray);\n\nif (people != null)\n{\n foreach (var p in people)\n {\n Console.WriteLine($"{p.Name} - {p.Age} años");\n }\n}\n\n3. Trabajo con objetos anidados y estructuras complejas
\n\nLos datos JSON reales rara vez son planos. Consideremos