25

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

例如,表单发布了一个值,first_name但我的 POCO 上的属性被调用FirstName。我将如何在 ServiceStack 中进行这样的映射

4

2 回答 2

35

ServiceStack 文本序列化程序支持 [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 });
于 2012-04-11T21:23:28.370 回答
5

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

JsConfig.EmitLowercaseUnderscoreNames = true; 

但是,根据我的经验,反序列化会失败,因为它期望 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);
    }
}
于 2014-03-07T13:51:56.537 回答