在ServiceStack中覆盖字段名称反序列化

kay*_*one 23 serialization servicestack

我正在使用ServiceStack反序列化一些HTML表单值,但无法弄清楚如何覆盖每个字段应该从中读取的值.

例如,表单将值发布到,first_name但调用我的POCO上的属性FirstName.我将如何在ServiceStack中进行映射

myt*_*thz 34

ServiceStack Text序列化程序支持[DataMember]别名,您可以使用Name参数指定每个字段应该是什么别名,例如:

[DataContract]
public class Customer
{
    [DataMember(Name="first_name")]
    public string FirstName { get; set; }

    [DataMember(Name="last_name")]
    public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

注意:一旦你添加[DataContract]/[的DataMember]属性的DTO的,则行为变选择加入,您将有添加[数据成员]对每个要序列化的属性.

为所有DTO发送惯用的JSON

您可以通过指定以下全局设置来指示JSON序列化遵循不同的约定:

//Emit {"firstName":"first","lastName":"last"}
JsConfig.Init(new Config { TextCase = TextCase.CamelCase });

//Emit {"first_name":"first","last_name":"last"}
JsConfig.Init(new Config { TextCase = TextCase.SnakeCase });
Run Code Online (Sandbox Code Playgroud)


And*_*ndy 5

为了使用下划线约定序列化C#类,你需要将JsConfig.EmitLowercaseUnderscoreNames设置为true,正如mythz所说.

JsConfig.EmitLowercaseUnderscoreNames = true; 
Run Code Online (Sandbox Code Playgroud)

但是,根据我的经验,Deserialising会失败,因为它期望CamelCased的价值.要启用下划线json值反序列化,您需要设置JsConfig的PropertyConvention.

JsConfig.PropertyConvention = PropertyConvention.Lenient;
Run Code Online (Sandbox Code Playgroud)

我使用一个简单的帮助方法来解决序列化和反序列化问题.

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);
    }
}
Run Code Online (Sandbox Code Playgroud)