serialization - serialize - serializar y deserializar json c#
Anular deserialización de nombre de campo en ServiceStack (2)
Estoy usando ServiceStack para deserializar algunos valores de formularios HTML, pero no puedo encontrar la manera de anular el valor que debe leer cada campo.
Por ejemplo, el formulario envía un valor a first_name
pero la propiedad en mi POCO se llama FirstName
. cómo haría un mapeo así en ServiceStack
Los serializadores de texto de ServiceStack admiten alias de [DataMember] donde puede usar el parámetro Name para especificar a qué alias debe pertenecer cada campo, por ejemplo:
[DataContract]
public class Customer
{
[DataMember(Name="first_name")]
public string FirstName { get; set; }
[DataMember(Name="last_name")]
public string LastName { get; set; }
}
Nota: Una vez que agrega atributos [DataContract] / [DataMember] a sus DTO, el comportamiento se convierte en opt-in y tendrá que agregar [DataMember] en cada una de las propiedades que desea serializar.
Emisión de JSON idiomática para todos los DTO
Puede indicar a la serialización de JSON que siga una convención diferente especificando las siguientes configuraciones globales:
//Emit {"firstName":"first","lastName":"last"}
JsConfig.EmitCamelCaseNames = true;
//Emit {"first_name":"first","last_name":"last"}
JsConfig. EmitLowercaseUnderscoreNames = true;
Para serializar la clase C # con la convención de subrayado, debe establecer JsConfig.EmitLowercaseUnderscoreNames en true como dijo .
JsConfig.EmitLowercaseUnderscoreNames = true;
Pero, en mi experiencia, la deserialización fracasaría, ya que espera valores CamelCased. Para habilitar la deserialización del valor JSON de subrayado, debe establecer PropertyConvention de JsConfig.
JsConfig.PropertyConvention = PropertyConvention.Lenient;
Utilizo un método simple de ayuda para resolver el problema de serialización y deserialización.
public static class JsonHelpers
{
public static string ToUnderscoredJson<T>(this T obj)
{
JsConfig.EmitLowercaseUnderscoreNames = true;
return JsConfig.PreferInterfaces
? JsonSerializer.SerializeToString(obj, AssemblyUtils.MainInterface<T>())
: JsonSerializer.SerializeToString(obj);
}
public static T FromUnderscoredJson<T>(this string json)
{
JsConfig.PropertyConvention = PropertyConvention.Lenient;
return JsonSerializer.DeserializeFromString<T>(json);
}
}