我正在尝试解决向后兼容的问题,以前以前是double
属性,现在是自定义类型。我的想法是读取double
并简单地使用自定义json转换器将其转换。
之前为:
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
方法中,我不想做任何“特别的事情,我的实现正确吗?还是有一种简单的方法来防止转换器在序列化时执行任何“特殊”操作?
[JsonConverter(typeof(MyJsonConverter))]
public class A
{
public MyType Value { get; set; }
}
public class AConverter : JsonConverter
{
public override bool CanConvert(Type objectType) => objectType == typeof(A);
public override bool CanWrite => false;
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JObject jObject = JObject.Load(reader);
// Check if the keys contains "Name"
string name = jObject["Name"]?.ToString();
var a = new A();
if (name != null)
{
a.Value = new MyType
{
Name = name,
Value = jObject["Value"].Value<double>()
};
}
else
{
a.Value = jObject["Value"].ToObject<MyType>();
}
return a;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
要使用默认的序列化,只需将CanWrite
替换为false
。