Adios, Newtonsoft, hola System.Text.Json

Desde que el formato JSON comenzó a formar parte de nuestras vidas, la librería del neozelandés James Newton-King ha acompañado la práctica totalidad de los desarrollos realizados en .NET que requerían el uso de la serialización JSON. Su facilidad de uso, su rapidez y la comodidad que supone la distribución en paquetes NuGet la han convertido en una biblioteca tremendamente popular, descargada por cientos de miles de desarrolladores en todo el mundo. A día de hoy, el administrador de paquetes NuGet de Visual Studio nos informa de que más de 655.000 desarrolladores han descargado el paquete NuGet que permite trabajar con las clases de Json.NET.

Tal ha sido la implantación de esta librería que incluso en los ejemplos sobre serialización JSON disponibles en la documentación de .NET aparece el namespace de Newtonsoft. Aunque no es tan incomprensible teniendo en cuenta que el autor de la librería hace ya tiempo que forma parte de la plantilla del gigante de Seattle.

En la segunda década de este siglo Microsoft está ajustando sus estándares: aparecen nuevos frameworks, los nombres cambian y las librerías se actualizan. Era ya el momento de integrar la serialización JSON dentro de lo que finalmente se llamará .NET 5, y eso a dado lugar a la aparición del namespace System.Text.Json.

Cambiarlo todo para que nada cambie

No hay duda de que el primer planteamiento que ha estado en la mente de los diseñadores del nuevo namespace (probablemente el propio Newton-King ha formado parte de ellos) ha sido el de mantener la compatibilidad. Los cientos de miles de líneas de código que emplean hoy en día las librerías de Json.NET no podían quedar obsoletas de la noche a la mañana, así que se ha buscado la máxima compatibilidad en los nombres de las clases, los métodos y las propiedades. El serializador de System.Text.Json emplea un método idéntico al de Json.NET y también utiliza una método genérico que requiere como tipo la clase en la que se deserializará o serializará la cadena JSON. El siguiente código es idéntico al que emplearíamos con las clases de Newtonsoft:


using System.Text.Json; 
using System.Text.Json.Serialization;

string jsonString; 
jsonString = JsonSerializer.Serialize(miObjeto);
Miclase miObjeto2 = JsonSerializer.Deserialize<MiClase>(jsonString);

También es posible deserializar mediante un método no genérico que emplea inferencia de tipos y asimismo se incorporan muchas opciones que la librería de Newtonsoft ha ido añadiendo a lo largo de las versiones – 12 hasta este momento.

Guía de migración a System.Text.Json

Sin embargo no todo son buenas noticias en esta transición. La actualización de la biblioteca de serialización Json al namespace System.Text requiere la conformidad con los estándares que Microsoft está obligada a respetar. Eso se traduce en ciertas incompatibilidades entre ambas bibliotecas. La biblioteca de System respeta el estándar RFC 8259 de manera que ciertas conversiones automáticas que realizaba la librería de NewtonKing ya no son aceptables. Otros comportamientos, como la no distinción entre mayúsculas y minúsculas o la conversión de cadenas a números, están controlados por opciones globales.

En la mayor parte de los casos la biblioteca de System.Text ofrece una alternativa viable al funcionamiento de Json.NET. En otros casos la incompatibilidad es completa y el desarrollador tendrá que retocar el código. Podéis encontrar una guía completa de la migración en este enlace.

Os recomendamos la lectura atenta de los condicionantes de la migración si deseáis adaptar vuestro código legado a las nuevas bibliotecas. En caso contrario podéis seguir utilizando la biblioteca  Json.NET, ya que no quedará discontinuada. Para desarrollos nuevos, no obstante, lo recomendable sería adherirse a la implementación integrada en las diferentes versiones de los frameworks de .NET (.NET Standard 2.0, .NET Framework 4.7 y posterior, y .NET Core 2.0-2.2).