使用不带属性的Newtonsoft.Json序列化和反序列化自定义类型

时间:2014-03-08 11:10:06

标签: c# serialization json.net

我知道我可以使用JsonConverters进行自定义序列化/反序列化。 但我不想通过属性来应用它,而是通过代码。

我的框架有对序列化程序的插件支持,我现在即将添加Newtonsoft JSON支持。 因此,我不想在我的类型中添加特定于newtonsoft的属性。 有没有办法以任何其他方式将JsonConverter应用于特定类型?

我想按照以下方式做点什么:

  serializer.AddTypeHandler(typeof(MyType), serializeFunction, deserializeFunction);

除了attribs之外的任何方式都会很好..

1 个答案:

答案 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);