2

古いjsonを逆シリアル化するときに、下位互換性を解決しようとしています。以前はdoubleプロパティがあり、現在はカスタム タイプに変更されています。

私の考えは、カスタム json コンバーターを使用して、それを読み取っdoubleて単純に変換することです。

以前は:

public class A
{
    [JsonProperty)]
    string Name { get; set; }
    [JsonProperty)]
    double Value { get; set; }
}

として連載

{"Name":"test","Value":33.0}

新しいもの:

public class A
{
    [JsonProperty]
    [JsonConverter(typeof(MyJsonConverter))]
    public MyType Value { get; set; }
}

として連載

{"Value":{"Value":33.0,"Name":"test", ...}},

コンバータ:

public class MyJsonConverter : JsonConverter
{
    public override bool CanConvert(Type objectType) => true;

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        if (reader.Value is double value)
            return new MyType(value, ???); // here is the problem, I need Name value here
        return reader.Value;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) =>
        JToken.FromObject(value).WriteTo(writer);
}

しかし、構築MyTypeするには、別のプロパティの値である文字列パラメーターが必要ですName

Nameのコンバーターから値にアクセスする方法はValue? 逆シリアル化されたものにアクセスする方法は? 何かの木はありますか?トークンツリー?

別のこと:WriteJsonメソッドで「何も」特別なことをしたくないのですが、実装は正しいですか?または、シリアル化時にコンバーターが「特別な」ことをするのを防ぐ簡単な方法はありますか?

4

1 に答える 1