我正在使用 ServiceStack 反序列化一些 HTML 表单值,但无法弄清楚如何覆盖应该读取每个字段的值。
例如,表单发布了一个值,first_name
但我的 POCO 上的属性被调用FirstName
。我将如何在 ServiceStack 中进行这样的映射
我正在使用 ServiceStack 反序列化一些 HTML 表单值,但无法弄清楚如何覆盖应该读取每个字段的值。
例如,表单发布了一个值,first_name
但我的 POCO 上的属性被调用FirstName
。我将如何在 ServiceStack 中进行这样的映射
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]。
您可以通过指定以下全局设置来指示 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 });
为了使用下划线约定序列化 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);
}
}