C# JsonIgnore 到基本 class

C# JsonIgnore to basic class

我有class

public class SettingsExpires : ViewModelBase
{
    private int? frequency;
    [JsonProperty("frequency")]
    public int? Frequency
    {
        get => frequency;
        set => this.Set(ref frequency, value);
    }
}

其中 ViewModelBaseabstract class 来自 GalaSoft.MvvmLight 当我尝试将我的 class 序列化为 json 并得到这个时,我的问题就开始了:

{{  "frequency": null, "IsInDesignMode": false}}

我从基本的 class ViewModelBase

得到 IsInDesignMode
public bool IsInDesignMode { get; }

如何从基础 class 中忽略此 属性? 我试过这样的事情:

public class SettingsExpires : ViewModelBase
{
    private int? frequency;
    [JsonProperty("frequency")]
    public int? Frequency
    {
        get => frequency;
        set => this.Set(ref frequency, value);
    }
    [JsonIgnore]
    public new bool IsInDesignMode { get; }
}

或者这个:

public class SettingsExpires : ViewModelBase
{
    private int? frequency;
    [JsonProperty("frequency")]
    public int? Frequency
    {
        get => frequency;
        set => this.Set(ref frequency, value);
    }
    [JsonIgnore]
    public bool IsInDesignMode { get; }
}

但是没用

您可以定义一个 custom contract resolver 来忽略这些属性。例如,

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

        if (property.DeclaringType == typeof(ViewModelBase) && property.PropertyName == "IsInDesignMode")
        {
            property.ShouldSerialize = x=> false;
        }

        return property;
    }
}

现在您可以通过指定合同解析器来序列化您的数据。

var result = JsonConvert.SerializeObject(
    data,
    Formatting.Indented,
    new JsonSerializerSettings { ContractResolver = new ShouldSerializeContractResolver() }
);

Anu Viswan 给了(恕我直言)一个非常好的解决方案。

或者,您可以在 class(es) 之上使用属性 [JsonObject(MemberSerialization.OptIn)] 进行序列化,这将使您能够清楚地选择您想要的字段序列化。

但它有一个缺点:您必须在 JSON 中的每个 属性 上放置 [JsonProperty]。 在某些情况下非常少,但如果您有很多 class 要序列化,这可能会很乏味。

您可以选择最适合您的解决方案:)

通过使用以下属性修饰派生的 class (SettingsExpires):

[JsonObject(MemberSerialization.OptIn)]

你基本上是在指示序列化程序只包含那些用 JsonProperty 明确注释的属性。其他一切都将被忽略。

Reference