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

标签 c# asp.net-mvc mongodb json.net

我有一个 MVC .net 项目,我正在使用 mongodb。 我使用自定义 JsonConverter 将 ObjectId 属性序列化为字符串,正如我在此答案中所述: Automatically retun mongodb ObjectId as string with Json.NET in MVC

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

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

谢谢!

最佳答案

是的,您可以使用自定义 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);

希望这会有所帮助。

关于c# - 在没有属性的类上全局使用 JsonConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27332258/

相关文章:

asp.net-mvc - 如何利用 Resharper 的 "navigate to controller method"功能

javascript - Express 中的动态路由, "Cannot read property ' concat' of undefined”错误

node.js - Mongoose 聚合 $sum 返回零

C# EdiFabric 导出 EDI 835 文件

c# - ListView 不随分组滚动

c# - Entity Framework 简单报表

javascript - 我应该在一些操作后关闭 Mongo 连接吗?

c# - UTF8 文件开头字符正在破坏序列化器和读取器

c# - 将现有用户从 MVC 4 SimpleMembership 迁移到 MVC 5 ASP.NET Identity

c# - 静态存储库 - 解决方法