在没有属性的类上全局使用 JsonConverter

本文关键字:全局 JsonConverter 属性 | 更新日期: 2023-09-27 18:33:17

我有一个MVC .net项目,我正在使用mongodb。我使用自定义 JsonConverter 将 ObjectId 属性序列化为字符串,如我在此答案中所述:自动将 mongodb ObjectId 重新调整为字符串,并在 MVC 中 Json.NET

在那里,我使用了一个属性,以便自定义转换器用于某个属性:[JsonConverter(typeof(ObjectIdConverter))

有没有办法告诉序列化程序在 ObjectId 类型的所有属性上使用 ObjectIdConverter?我不想遍历整个项目并添加此属性。

谢谢!

在没有属性的类上全局使用 JsonConverter

是的,可以使用自定义IContractResolver以编程方式将JsonConverter应用于类或属性。 执行此操作的最简单方法是从 DefaultContractResolver 类派生解析程序,然后重写相应的方法。 下面是一个示例解析程序,它指示 Json.Net 对ObjectId类型的所有实例使用 ObjectIdConverter,无论它们可能出现在哪个类中。

class CustomResolver : DefaultContractResolver
{
    protected override JsonObjectContract CreateObjectContract(Type objectType)
    {
        JsonObjectContract contract = base.CreateObjectContract(objectType);
        if (objectType == typeof(ObjectId))
        {
            contract.Converter = new ObjectIdConverter();
        }
        return contract;
    }
}

若要使用解析程序,可以构造一个JsonSerializer实例并在其上设置 ContractResolver 属性,然后使用该实例执行序列化/反序列化。 如果您使用的是 JObject.ToObject()JObject.FromObject() ,请注意,这两种方法都有接受JsonSerializer实例的重载。

JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();
JObject jo = JObject.FromObject(foo, serializer);

或者,如果使用 JsonConvert 类执行序列化/反序列化,则可以创建 JsonSerializerSettings 的实例,在其上设置 ContractResolver 属性,然后将设置传递给 SerializeObject()DeserializeObject() 方法。

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);

希望这有帮助。