[Tip] Serialización/Deserialización Json omitiendo «JsonProperty» Name (o no) !


Resultado de imagen de json

Hoy me encontré con una situación en la que un modelo/dto necesiba ser serializado/deserializado de distinta manera dependiendo de ciertas situaciones. ¿Como se llega a esta situación?

¡Bueno, no es que suela ser habitual, pero ocurre, y en concreto, cuando desarrollas un Middlewares (NetCore) que necesita de integración entre un Front (Angular) que lo consume y un Backoffice (Python) que utiliza. Si a esto le añadimos distintos equipos, tiempos ajustados, cambios de requisitos, etc., pues puedes ser hasta «normal» !

A continuación puedes ver la solución, que ademas puedes localizarla en Github:

public class OmitJsonPropertyNameContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        if (!string.IsNullOrWhiteSpace(property.UnderlyingName))
            property.PropertyName = property.UnderlyingName;

        return property;
    }
}

Ejemplos y casos de usos:

public static class Program
{
    static void Main(string[] args)
    {
        // Use case 1: Standard deserialization
        string json1 = "{\"first_name\":\"Juan Luis\",\"LastName\":\"Guerrero\"}";
        var p1 = JsonConvert.DeserializeObject<Person>(json1);
        Console.WriteLine("Person 1:");
        Console.WriteLine($"\t{JsonConvert.SerializeObject(p1)}");


        // Use Case 2,3, 4 settings:
        var setting = new JsonSerializerSettings
        {
            ContractResolver = new OmitJsonPropertyNameContractResolver()
        };


        // Use Case 2: JsonProperty Name ignored/omited when serialize
        var p2 = JsonConvert.DeserializeObject<Person>(json1);
        Console.WriteLine("Person 2:");
        Console.WriteLine($"\t{JsonConvert.SerializeObject(p2, setting)}");


        // Use Case 3: JsonProperty Name ignored/omited when Deserialize
        string json3 = "{\"FirstName\":\"Juan Luis\",\"LastName\":\"Guerrero\"}";
        var p3 = JsonConvert.DeserializeObject<Person>(json3, setting);
        Console.WriteLine("Person 3:");
        Console.WriteLine($"\t{JsonConvert.SerializeObject(p3)}");


        // Use Case 4: JsonProperty Name ignored/omited when Serialice & Deserialize
        string json4 = "{\"FirstName\":\"Juan Luis\",\"LastName\":\"Guerrero\"}";
        var p4 = JsonConvert.DeserializeObject<Person>(json4, setting);
        Console.WriteLine("Person 4:");
        Console.WriteLine($"\t{JsonConvert.SerializeObject(p4, setting)}");
    }
}

Cuya salida por consola es la siguiente:

Poco más que añadir en este TIP. ¡Espero que sirva de ayuda !
Un saludo

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.