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的,则行为变选择加入,您将有添加[数据成员]对每个要序列化的属性.
您可以通过指定以下全局设置来指示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)
为了使用下划线约定序列化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)
归档时间: |
|
查看次数: |
8526 次 |
最近记录: |