您可以通过创建自定义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