
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