Imagen de Maitree Rimthong en Pexel

Actualización 10/02/20024:

He actualizado el artículo en respuesta a la controversia percibida a través de mis redes sociales: los datos presentados son contundentes y, en vista de ello, la migración se vuelve prácticamente indispensable en ciertos sistemas de software para garantizar su eficiencia. Sin embargo, es crucial reconocer que la migración no puede ser una decisión tomada a la ligera ni ejecutarse de manera directa sin un análisis exhaustivo. Se deben considerar múltiples factores adicionales, tales como la compatibilidad entre sistemas, la interacción entre microservicios, las dependencias actuales, y las posibles complicaciones derivadas de la mezcla de bibliotecas, para asegurar la transición.

Más información en la advertencia final.

Artículo original:

En el dinámico y competitivo ring de la programación en C#, dos pesos pesados del manejo de JSON se enfrentan en un duelo de rendimiento que ha capturado la atención de desarrolladores alrededor del mundo. Por un lado, el veterano Newtonsoft.Json, el contendiente que ha dominado el espacio de la serialización JSON durante años, conocido por su flexibilidad y facilidad de uso. Por el otro, el ágil y optimizado System.Text.Json, que con la llegada de .NET 8 promete ofrecer una alternativa más eficiente y con mejor rendimiento.

Como desarrollador meticuloso y entusiasta, especialmente centrado en optimizar el rendimiento y la eficiencia de mis aplicaciones en la nube de Azure, me he percatado de que la elección entre Newtonsoft.Json y System.Text.Json se ha convertido en un tema recurrente y enérgicamente debatido entre la comunidad de desarrolladores. Determinar cuál de estos dos titanes es el más adecuado para la manipulación de JSON en C# trasciende meras preferencias personales; estamos hablando de una decisión estratégica esencial que puede tener un impacto significativo en la eficacia y agilidad operativa de nuestras aplicaciones alojadas en Azure, donde cada milisegundo de rendimiento cuenta y se refleja directamente en la experiencia del usuario final.

Por eso, he decidido poner los guantes y subirme al cuadrilátero para arbitrar esta pelea técnica. ¿Será Newtonsoft.Json capaz de mantener su título como el campeón indiscutible o será System.Text.Json quien, con sus optimizaciones y mejoras en .NET 8, le arrebatará la corona?

Escenario de la comparativa

Nos centraremos en dos casos de uso principales:

  • Serialización y deserialización de un único conjunto de datos grande.
  • Serialización y deserialización de múltiples conjuntos de datos pequeños.

Para los datos de prueba, utilizaremos el paquete de NuGet llamado Bogus para generar usuarios aleatorios, cada uno con su propia identidad única.

[Params(100000)]
public int Count { get; set; }

private List<User> testUsers =  [ ];

[GlobalSetup]
public void GlobalSetup()
{
    var faker = new Faker<User>().CustomInstantiator(
        f =>
            new User(
            Guid.NewGuid(),
            f.Name.FirstName(),
            f.Name.LastName(),
            f.Internet.Email(f.Name.FirstName(), f.Name.LastName())
            )
    );
    testUsers = faker.Generate(Count);
}
Setup
Comparación

El proyecto compara la parte más basica que es lo que se usa en el 90% de los proyectos: la serialización y la deserialización.

Ejecutamos:

dotnet run -c Release
Conclusión:

¡Señoras y señores, aprieten sus cinturones de seguridad y prepárense para el resultado de esta épica batalla de los titanes de la serialización! Tras un espectacular intercambio de habilidades técnicas y destreza en el ring, el árbitro levanta la mano y declara al ganador por knockout técnico: ¡System.Text.Json de Microsoft se lleva la corona! Con su agilidad nativa de .NET Core, su velocidad relámpago y su eficiencia en el consumo de recursos, ha dejado a Newtonsoft.Json contando las estrellas. ¡Levantamos los guantes al cielo y celebramos al nuevo campeón indiscutible del manejo de JSON en C#! ¡Que suene la campana de la victoria para System.Text.Json! 🥊💥🏆

Fuera de esta forma más jocosa de contar la compratiba:

Este artículo surge como una carta a mi yo del pasado, el que se encontraba una y otra vez inmerso en el debate sobre Newtonsoft.Json versus System.Text.Json (desde la versión 6). Siempre he sido de la opinión de que las discusiones deben basarse en evidencias concretas en lugar de en preferencias personales o percepciones subjetivas. Por eso, con el fin de aportar claridad y sustancia a este diálogo recurrente, me propuse realizar una comparación exhaustiva y objetiva de estas dos librerías de serialización JSON en .NET.

Mi objetivo no es solo satisfacer mi propia curiosidad, sino también proporcionar a otros desarrolladores las herramientas y la información necesarias para tomar decisiones informadas. Después de todo, en el mundo del desarrollo de software, donde el rendimiento y la eficiencia son vitales (aun más en la nube), no nos podemos permitir el lujo de basar nuestras elecciones en el ‘porque siempre se ha hecho así’ o en el ‘me siento más cómodo con esta opción’.

Así que, este análisis es un recurso para aquellos que, como yo, desean evitar caer en discusiones interminables y prefieren presentar argumentos sólidos y datos verificables. Vamos a despejar el campo de batalla con hechos y no con opiniones, para que la próxima vez que te encuentres frente a este debate, tengas más que simples palabras para respaldar tu posición.

Advertencia

La mezcla de bibliotecas de serialización JSON, como System.Text.Json y Newtonsoft.Json, en un entorno de microservicios puede conducir a inconsistencias y errores difíciles de rastrear. Cada biblioteca maneja la serialización y deserialización de manera diferente y tiene distintas capacidades de configuración y comportamientos predeterminados. Por ejemplo, las diferencias en la gestión de casos de propiedad, el tratamiento de valores nulos, y la serialización de tipos complejos pueden llevar a que el mismo objeto sea serializado de manera diferente dependiendo de la biblioteca utilizada. Esto puede ser particularmente problemático cuando los microservicios necesitan comunicarse entre sí y esperan una estructura JSON consistente.

Es importante considerar la migración a una única biblioteca para mantener la uniformidad en todo el sistema. Microsoft proporciona guías detalladas para la migración de Newtonsoft.Json a System.Text.Json que debes conocer.

No consideres el artículo como un dogma o una indicación para migrar directamente a una sola biblioteca de serialización JSON. Es esencial realizar un análisis minucioso de cómo y en qué medida estos cambios pueden impactar tu sistema actual. Antes de tomar una decisión, evalúa cuidadosamente las implicaciones de la migración, teniendo en cuenta las diferencias de funcionalidad y comportamiento entre System.Text.Json y Newtonsoft.Json, así como las necesidades específicas de tu aplicación.