我知道我可以使用JsonConverters进行自定义序列化/反序列化。 但我不想通过属性来应用它,而是通过代码。
我的框架有对序列化程序的插件支持,我现在即将添加Newtonsoft JSON支持。 因此,我不想在我的类型中添加特定于newtonsoft的属性。 有没有办法以任何其他方式将JsonConverter应用于特定类型?
我想按照以下方式做点什么:
serializer.AddTypeHandler(typeof(MyType), serializeFunction, deserializeFunction);
除了attribs之外的任何方式都会很好..
答案 0 :(得分:4)
是的,Json.Net有一个可以用于此目的的“ContractResolver”概念。制作自定义解析器的最简单方法是从DefaultContractResolver
继承。然后,您可以覆盖CreateContract
方法,根据需要将转换器应用于特定类型。例如:
class CustomResolver : DefaultContractResolver
{
protected override JsonContract CreateContract(Type objectType)
{
JsonContract contract = base.CreateContract(objectType);
if (objectType == typeof(Foo))
{
contract.Converter = new FooConverter();
}
return contract;
}
}
您可以将解析器应用于序列化程序,如下所示:
JsonSerializerSettings settings = new JsonSerializerSettings
{
ContractResolver = new CustomResolver()
};
string json = JsonConvert.SerializeObject(foo, settings);