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

时间:2012-04-11 21:10:01

标签: serialization servicestack

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

例如,表单会将值发布到first_name,但我的POCO上的属性称为FirstName。我将如何在ServiceStack中进行映射

2 个答案:

答案 0 :(得分:33)

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; }
}

注意:将[DataContract] / [DataMember]属性添加到DTO后,行为将成为选择加入,您将在要序列化的每个属性上添加[DataMember]。

为所有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 });

答案 1 :(得分:5)

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

JsConfig.EmitLowercaseUnderscoreNames = true; 

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

JsConfig.PropertyConvention = PropertyConvention.Lenient;

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

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);
    }
}