Anular deserialización de nombre de campo en ServiceStack


Estoy usando ServiceStack para deserializar algunos valores de formulario HTML, pero no puedo averiguar cómo anular el valor desde el que se 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

Author: kay.one, 2012-04-12

2 answers

Los serializadores de texto ServiceStack admiten alias [DataMember] donde puede usar el parámetro Name para especificar qué alias debe ser 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 agregue los atributos [DataContract] / [DataMember] a sus DTOs, el comportamiento se convierte en opt-in y tendrá que agregar [DataMember] en cada una de las propiedades que desea serializar.

Emitiendo JSON idiomático para todos los DTO

Puede indicar a la serialización JSON que siga una convención diferente especificar la siguiente configuración global:

//Emit {"firstName":"first","lastName":"last"}
JsConfig.EmitCamelCaseNames = true; 

//Emit {"first_name":"first","last_name":"last"}
JsConfig. EmitLowercaseUnderscoreNames = true; 
 32
Author: mythz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-24 17:05:16

Para serializar la clase C# con la convención de subrayado, debe establecer JsConfig.EmitLowercaseUnderscoreNames a true como mythz dijo.

JsConfig.EmitLowercaseUnderscoreNames = true; 

Pero, en mi experiencia, la deserialización fracasaría, ya que espera valores basados en camellos. Para habilitar la deserialización de valores de subrayado json, debe establecer PropertyConvention de JsConfig.

JsConfig.PropertyConvention = PropertyConvention.Lenient;

Utilizo un método de ayuda simple 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);
    }
}
 5
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:31:52