Newtonsoft JSON ShouldSerialize和继承

时间:2017-02-07 20:27:48

标签: c# asp.net-web-api json.net

我有一个这样的课程:

parseInt(aThing, 10)

此类用于存储在NoSQL数据库中,因此我需要存储public class Foo { public int Bar { get; set;} } 值。但是,我不想通过我的API公开这个值。 所以我创建了一个继承自Bar的类,我将从API返回。

我按照我找到的here文档创建了方法Foo

ShouldSerializeBar

但是,不调用该方法。是否有针对此方法或其他方法来实现此目的?

2 个答案:

答案 0 :(得分:6)

public class Foo
{
    public int Bar { get; set;}

    public virtual bool ShouldSerializeBar()
    {
        return true;
    }
}

public class Foo2 : Foo
{
    public override bool ShouldSerializeBar()
    {
        return false;
    }
}

答案 1 :(得分:1)

如果您使用IContractResolver,则无需继承Foo

来自文档

  

还可以使用IContractResolver设置ShouldSerialize。   使用IContractResolver有条件地序列化属性是   如果您不想在类上放置ShouldSerialize方法,则非常有用   或者你没有申报课程而且没有。

在你的情况下,这样的事情应该有用。

public class ShouldSerializeContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        if (property.DeclaringType == typeof(Foo) && property.PropertyName == "Bar")
        {
            property.ShouldSerialize = instance => false;
        }

        return property;
    }
}

然后你可以像

一样使用它
var foo = new Foo();
foo.Bar = 1;

string json = JsonConvert.SerializeObject(foo,
        Formatting.Indented,
        new JsonSerializerSettings { ContractResolver = new ShouldSerializeContractResolver() });

虽然我不知道这是否比新类(Foo2)及其基础中的虚方法更具侵入性,但至少是另一种选择;)