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