3

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; }

4

2 回答 2

2

我发现了一种更简单的方法来解决这个问题,而无需创建自定义JsonConverter

如果将属性放在属性JsonProperty上,它会起作用。

[JsonProperty]
public new ICollection<PersonDto> Persons { get; set; }

我不知道为什么 Json.Net 需要这里的属性。通常它会序列化所有没有用JsonIgnore. 如果有人知道,欢迎您发表评论。

于 2012-05-10T06:41:35.943 回答
1

如果你想这样做是因为你想指定如何将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())
于 2012-05-09T13:22:13.177 回答