Json.NET如何重写通过属性定义自定义JsonConverter的类型的序列化
本文关键字:JsonConverter 自定义 类型 序列化 定义 属性 NET 何重 写通过 Json | 更新日期: 2023-09-27 18:20:14
我正在尝试使用Json.NET和自定义JsonConverter对象反序列化一个类。该类当前使用JsonConverterAttribute为默认序列化定义了一个转换器。我需要通过传递自定义转换器来进行自定义反序列化。然而,反序列化似乎仍然使用默认的转换器。如何让Json.NET更喜欢我的自定义转换器?
这里有一些示例代码来演示这个问题。我使用的是NewtonSoft.Json 4.5.11:
void Main()
{
JsonConvert.DeserializeObject<Foo>("{}"); // throws "in the default converter"
var settings = new JsonSerializerSettings { Converters = new[] { new CustomConverter() } };
JsonConvert.DeserializeObject<Foo>("{}", settings); // still throws "in the default converter" :-/
}
[JsonConverter(typeof(DefaultConverter))]
public class Foo {
}
public class DefaultConverter : JsonConverter {
public override bool CanConvert(Type objectType)
{
return typeof(Foo).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new Exception("in the default converter!");
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new Exception("in the default converter!");
}
}
public class CustomConverter : JsonConverter {
public override bool CanConvert(Type objectType)
{
return typeof(Foo).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new Exception("in the custom converter!");
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new Exception("in the custom converter!");
}
}
您需要使用自定义合同解析程序。只有在未为类型指定转换器的情况下,默认协定冲突解决程序才会使用设置中的转换器。
class CustomContractResolver : DefaultContractResolver
{
protected override JsonConverter ResolveContractConverter (Type objectType)
{
if (typeof(Foo).IsAssignableFrom(objectType))
return null; // pretend converter is not specified
return base.ResolveContractConverter(objectType);
}
}
用法:
JsonConvert.DeserializeObject<Foo>("{}", new JsonSerializerSettings {
ContractResolver = new CustomContractResolver(),
Converters = new[] { new CustomConverter() },
});