您可以通過創建自定義DefaultContractResolver
並重寫其CreateProperty
方法做到這一點。
例如,給定一個Foo
基地和派生Bar
:
public class Foo
{
[JsonIgnore]
public string Name { get; set; }
public int Age { get; set; }
}
public class Bar : Foo
{ }
您可以創建以下合同解析:
public class MyTypeContractResolver<T> : DefaultContractResolver
{
protected override JsonProperty CreateProperty(MemberInfo member,
MemberSerialization
memberSerialization)
{
var property = base.CreateProperty(member, memberSerialization);
property.Ignored = false;
property.ShouldSerialize = propInstance => property.DeclaringType != typeof (T);
return property;
}
}
這將所有屬性設置爲Ignored = false
,然後分析它們由給定的謂詞:
propInstance => property.DeclaringType != typeof (T);
在我們的情況下,這意味着「只有當它們不是Foo
類型時才能序列化」(因爲Foo是DeclaryingType
)。
然後當你要反序列化,你通過合同解析器的一個實例JsonSerializerSettings
:
var bar = new Bar();
var result = JsonConvert.SerializeObject(bar,
new JsonSerializerSettings {ContractResolver = new MyTypeContractResolver<Bar>()});
感謝您對ContractResolver的解釋!如果我找不到更輕的解決方案,我會採用這種方式,至少可以進行嚴格的定製。 – PLNech 2015-02-23 13:37:16
@PLNech當然可以。這絕對是「最重的」解決方案,但我認爲它也是使用Json.NET處理它的「正確」方式。 – 2015-02-23 13:39:04
我很感激我現在有一個對「正確」方式的引用,如果我發現自己無法使用「懶惰」方式:P – PLNech 2015-02-23 13:40:51