Json.Net 在子类中序列化重写的属性没有问题。
public override ICollection<Person> Persons { get; set; }
但是,如果我尝试在属性上使用new
,序列化将失败。没有例外; Persons
只是从不序列化。
public new ICollection<Person> Persons { get; set; }
这是为什么呢?
(我知道,这个例子没有多大意义。这只是一个例子。稍后的目标是能够更改属性的数据类型public new ICollection<PersonDto> Persons { get; set; }
)
我发现了一种更简单的方法来解决此问题,而无需创建自定义JsonConverter
如果将属性JsonProperty
放在属性上,则它可以工作。
[JsonProperty]
public new ICollection<PersonDto> Persons { get; set; }
我不知道为什么 Json.Net 在这里需要这个属性。通常,它会序列化所有未用JsonIgnore
装饰的内容。如果有人知道,欢迎您发表评论。
这样做,因为您想指定如何Person
序列化为 JSON,我认为更好的解决方案是使用自定义JsonConverter
。转换器可能看起来像这样:
class PersonConverter : JsonConverter
{
public override void WriteJson(
JsonWriter writer, object value, JsonSerializer serializer)
{
var person = (Person)value;
serializer.Serialize(
writer,
new
{
Name = person.LastName,
Age = (int)(DateTime.Now - person.BirthDate).TotalDays / 365
});
}
public override object ReadJson(
JsonReader reader, Type objectType, object existingValue,
JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override bool CanConvert(Type objectType)
{
return objectType == typeof(Person);
}
}
然后你可以像这样使用它:
JsonConvert.SerializeObject(yourObject, new PersonConverter())