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

JSONにシリアル化する方法を正確に指定したいためにこれを行いたい場合はPerson、カスタムを使用する方が良い解決策だと思います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 に答える