web-dev-qa-db-ja.com

servicestack jsonシリアライザーのGetonlyプロパティを省略する方法は?

ServiceStack.Text名前空間のToJson<>()メソッドを使用して逆シリアル化するオブジェクトがあります。

シリアル化中にすべてのGETのみのプロパティを省略するにはどうすればよいですか? [Ignore]のような属性や、プロパティを省略できるように装飾できるものはありますか?

ありがとう

29
Hitesh.Aneja

ServiceStackのテキストシリアライザー は.NETのDataContractシリアライザーの動作に従います。つまり、オプトアウト_[IgnoreDataMember]_属性を使用してデータメンバーを無視できます。

_public class Poco 
{
    public int Id { get; set; }

    public string Name { get; set; }

    [IgnoreDataMember]
    public string IsIgnored { get; set; }
}
_

オプトインの代替手段は、シリアル化するすべてのプロパティを_[DataMember]_で装飾することです。残りのプロパティはシリアル化されません。例:

_[DataContract]
public class Poco 
{
    [DataMember]
    public int Id { get; set; }

    [DataMember]
    public string Name { get; set; }

    public string IsIgnored { get; set; }
}
_

最後に、属性を必要としない非侵入型のオプションもあります。例:

_JsConfig<Poco>.ExcludePropertyNames = new [] { "IsIgnored" };
_

シリアル化する必要のあるプロパティを動的に指定する

ServiceStackのSerializersは、プロパティをシリアル化する必要があるかどうかを示すために、従来の名前のShouldSerialize({PropertyName})メソッドを提供することにより、シリアル化の動的制御もサポートします。

_public class Poco 
{
    public int Id { get; set; }

    public string Name { get; set; }

    public string IsIgnored { get; set; }

    public bool? ShouldSerialize(string fieldName)
    {
        return fieldName == "IsIgnored";
    }
}
_

ConditionalSerializationTests.cs のその他の例

51
mythz

Null許容メンバーの場合、シリアル化する前にnullに設定することもできます。

これは、複数のAPI呼び出しに再利用される単一のビュー/ APIモデルを作成する場合に特に便利です。サービスは、応答オブジェクトに設定する前に修正できます。

例:

    public SignInPostResponse Post(SignInPost request)
    {
        UserAuthentication auth = _userService.SignIn(request.Domain, true, request.Username, request.Password);

        // Map domain model ojbect to API model object. These classes are used with several API calls.
        var webAuth = Map<WebUserAuthentication>(auth);

        // Exmaple: Clear a property that I don't want to return for this API call... for whatever reason.
        webAuth.AuthenticationType = null;

        var response = new SignInPostResponse { Results = webAuth };
        return response;
    }

エンドポイントごとに、すべてのメンバー(null許容でないものを含む)のシリアル化を動的に制御する方法があればいいのにと思います。

0
Casey Plummer