【问题标题】:Newtonsoft JSON ShouldSerialize and inheritanceNewtonsoft JSON ShouldSerialize 和继承
【发布时间】:2017-02-07 20:27:48
【问题描述】:

我有这样的课:

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

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

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

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

但是,该方法没有被调用。是否有解决方法或其他方法来实现这一目标?

【问题讨论】:

  • 排除您的要求,您是否仅在Foo 上尝试过并成功了?
  • 是的应该提到它,它在直接序列化Foo时有效。
  • 这不起作用的原因是因为它在声明类型(又名Foo)上查找方法,而不是任何父/基类。除了以下答案之外,我没有看到其他解决方法。

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


【解决方案1】:
public class Foo
{
    public int Bar { get; set;}

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

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

【讨论】:

  • 这就是我最终所做的。它有效,但我想避免在我的基类中添加这个方法。无论如何,它现在可以解决问题;)
【解决方案2】:

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

来自文档

ShouldSerialize 也可以使用 IContractResolver 进行设置。 使用 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) 及其基类中的虚拟方法更具侵入性,但至少是另一种选择;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 2016-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    相关资源
    最近更新 更多