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# クラスをシリアル化するには、 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);
    }
}
于 2014-03-07T13:51:56.537 に答える