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

标签 c# serialization json.net

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

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

我想做一些类似的事情:

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

除了属性以外的任何方式都很好..

最佳答案

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

关于c# - 使用不带属性的 Newtonsoft.Json 序列化和反序列化自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22268478/

相关文章:

c# - 深度克隆一个对象

c# - 如何以编程方式从 Windows 联系人中检索所有联系人的详细信息?

scala - 反序列化后 DateTime 不等于自身

c# - 如何反转 System.Predicate<T>

c# - 如果查询未返回任何内容,linq 选择项的默认值

java - 如何使用ObjectOutputStream.writeObject()+Base64 (Java)深度序列化对象?

Java "NotSerializableException: java.net.Socket"不发送套接字时

c# - Json.NET:使用双引号反序列化

c#-4.0 - 通用 XML 序列化程序,但不适用于 JObject

c# - 将字符串数组添加到 JObject