如何省略在Servicestack json序列化程序中仅获取属性?

时间:2013-02-13 16:49:35

标签: json properties servicestack ignore

我有一个对象,我使用ServiceStack.Text命名空间中的ToJson<>()方法反序列化。

如何在序列化期间省略所有GET唯一的属性?是否有任何属性,如[Ignore]或我可以用我的属性装饰,以便可以省略它们?

由于

2 个答案:

答案 0 :(得分:51)

ServiceStack's Text serializers遵循.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

中的更多示例

答案 1 :(得分:0)

对于可以为空的成员,您还可以在序列化之前将其设置为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;
    }

我希望有一种方法可以动态控制每个端点方式的所有成员(包括不可空)的序列化。