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);
}
}
其中 ViewModelBase
是 abstract
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
明确注释的属性。其他一切都将被忽略。
我有class
public class SettingsExpires : ViewModelBase
{
private int? frequency;
[JsonProperty("frequency")]
public int? Frequency
{
get => frequency;
set => this.Set(ref frequency, value);
}
}
其中 ViewModelBase
是 abstract
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
明确注释的属性。其他一切都将被忽略。