【问题标题】:Globally use a JsonConverter on a class without the attribute在没有属性的类上全局使用 JsonConverter
【发布时间】:2014-12-07 00:46:10
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 试试 BsonSerializer.RegisterIdGenerator(typeof(xxx), new XXXObjectIdGenerator());

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


【解决方案1】:

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

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-02
    • 2021-10-07
    相关资源
    最近更新 更多