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