En el post anterior vimos cómo realizar consultas en archivos XML. Ahora veremos cómo consultar documentos JSON con LINQ.
Teniendo el siguiente documento JSON:
developer.json
{ "desarrolladores":[ { "id_empleado":"7894311", "nombre": "Karla Alvarez Montoya", "telefono": "555 32 53 138", "correo":"karla.alvarez@edu.mx" }, { "id_empleado":"74533267", "nombre": "Laura Torres Jimenez", "telefono": "552 99 00 112", "correo":"laura.torres@edu.mx" }, { "id_empleado":"55533800", "nombre": "Joan Sebastian Laredo Arsate", "telefono": "553 56 33 008", "correo":"joan.laredo.arsate@edu.mx" } ] }
1. Vamos a crear un proyecto .NET para consultar ese documento.
$ dotnet new console -n DemoLinqJson $ cd DemoLinqJson
2. Instalaremos los paquetes necesarios para manipular el docuemnto JSON:
Con la herramienta CLI:
$ dotnet add package Newtonsoft.Json --version 13.0.5-beta1
Con NuGet:
$ NuGet\Install-Package Newtonsoft.Json -Version 13.0.5-beta1
3. Modificamos el programa principal ``Program.cs``:
using System; using System.Linq; using Newtonsoft.Json.Linq; class Program { public static readonly string PATH = "developer.json"; static void Main() { try{ var json = File.ReadAllText(PATH); var data = JObject.Parse(json); Console.WriteLine("Contenido del archivo: {0}",data.ToString()); } catch (FileNotFoundException ex) { Console.WriteLine("El archivo no existe: {0}", ex.Message); } } }
4. Ejecutamos el proyecto:
$ dotnet run
Salida:
Contenido del archivo: { "desarrolladores": [ { "id_empleado": "7894311", "nombre": "Karla Alvarez Montoya", "telefono": "555 32 53 138", "correo": "karla.alvarez@edu.mx" }, { "id_empleado": "74533267", "nombre": "Laura Torres Jimenez", "telefono": "552 99 00 112", "correo": "laura.torres@edu.mx" }, { "id_empleado": "55533800", "nombre": "Joan Sebastian Laredo Arsate", "telefono": "553 56 33 008", "correo": "joan.laredo.arsate@edu.mx" } ] }
Como se puede observar hemos mostrado todo el contenido del archivo JSON. ¿Se podrá realizar consultas? Estamos a punto de averiguarlo.
Lo primero a hacer será crear una clase que contenga la lógica del JSON al leer.
Desarrollador.cs
using System.Text.Json.Serialization; namespace model { public class Desarrollador { [JsonPropertyName("id_empleado")] public string Id { get; set; } = string.Empty; [JsonPropertyName("nombre")] public string Nombre { get; set; } = string.Empty; [JsonPropertyName("telefono")] public string Telefono { get; set; } = string.Empty; [JsonPropertyName("correo")] public string Correo { get; set; } = string.Empty; } public class Root { [JsonPropertyName("desarrolladores")] public List<Desarrollador> Desarrolladores { get; set; } } }
Como se puede ver, esta clase es coherente con los atributos del JSON. No solo por el nombre sino por el tipo de dato.
Ahora modifiquemos el programa principal.
Program.cs
using System; using System.IO; using System.Linq; using System.Collections.Generic; using System.Text.Json; using model; class Program { public static readonly string PATH = "developer.json"; static void Main() { try { var json = File.ReadAllText(PATH); Root data = JsonSerializer.Deserialize<Root>(json); Console.WriteLine("Contenido del archivo:"); foreach (var dev in data.Desarrolladores) { Console.WriteLine($"{dev.Id} - {dev.Nombre} - {dev.Correo}"); } var desarrolladoresAgrupados = from dev in data.Desarrolladores group dev by dev.Id into idGroup select new { MyId = idGroup.Key, Count = idGroup.Count() }; foreach (var group in desarrolladoresAgrupados) { Console.WriteLine($"Id del empleado: {group.MyId}, Count: {group.Count}"); } } catch (FileNotFoundException ex) { Console.WriteLine("El archivo no existe: {0}", ex.Message); } } }
La parte que nos interesa es esta:
var json = File.ReadAllText(PATH); Root data = JsonSerializer.Deserialize<Root>(json); var desarrolladoresAgrupados = from dev in data.Desarrolladores group dev by dev.Id into idGroup select new { MyId = idGroup.Key, Count = idGroup.Count() }; foreach (var group in desarrolladoresAgrupados) { Console.WriteLine($"Id del empleado: {group.MyId}, Count: {group.Count}"); }
Este bloque lee el contenido del archivo, lo deserializa y posteriormente agrupa a los desarrolladores por su Id y cuenta cuántos hay en cada grupo. Si nos recuerda a una consulta SQL es por que toma referencia a ese lenguaje.
Traducida a una consulta SQL vendría siendo algo como esto:
SELECT id_empleado AS MyId, COUNT(*) AS Count FROM desarrolladores GROUP BY id_empleado;
Hacer consultas similares a los que se haría en SQL en archivos XML y/o JSON es psible gracias a LINQ.
Hay proyectos en los que no será de mucha ayuda.
Continuaremos en próximas entregas.
Enlaces:
https://www.newtonsoft.com/json/help/html/queryinglinqtojson.htmhttps://codemonkeyjunior.blogspot.com/2025/12/linq-consultando-documentos-xml.html
https://medium.com/@ddemirugur/c-13-net-9-part-10-linq-linq-to-xml-json-etc-f6f939f97222
https://developer.mescius.com/blogs/how-to-query-json-in-c-sharp-using-sql-linq-ado-net
https://learn.microsoft.com/es-es/dotnet/standard/linq/
https://www.johnpapa.net/linq-to-json-ndash-checking-for-an-object-or-array/
https://csharphardcoreprogramming.wordpress.com/2016/01/19/json-to-linq-to-json/
https://medium.com/hacking-building/using-linq-to-serialize-a-c-object-into-json-9ecbe9ca2941
https://codesignal.com/learn/courses/parsing-json-with-csharp/lessons/introduction-to-json-and-its-usage-in-csharp
