序列化使用 Json.Net 声明为 new 的继承属性不起作用



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())

相关内容

  • 没有找到相关文章

最新更新