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# クラスをシリアル化するには、 mythzが言ったように JsConfig.EmitLowercaseUnderscoreNames を true に設定する必要があります。
JsConfig.EmitLowercaseUnderscoreNames = true;
しかし、私の経験では、デシリアライズはキャメルケースの値を期待しているため、失敗します。アンダースコア 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);
}
}