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

C# 使用不带属性的Newtonsoft.Json序列化和反序列化自定义类型,c#,serialization,json.net,C#,Serialization,Json.net,我知道有一些JSONConverter可以用于自定义序列化/反序列化。 但我不想通过属性而不是代码来应用它 我的框架对序列化程序有插件支持,现在我要添加Newtonsoft JSON支持。 因此,我不想在我的类型中添加特定于newtonsoft的属性。 有没有其他方法可以将JsonConverter应用于特定类型 我想做以下几点: serializer.AddTypeHandler(typeof(MyType), serializeFunction, deserializeFunction)

我知道有一些JSONConverter可以用于自定义序列化/反序列化。 但我不想通过属性而不是代码来应用它

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

我想做以下几点:

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

除了attribs以外的任何方式都很好。

是的,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);

是的,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);