在全球范围内使用JsonConverter的一类无属性 [英] Globally use a JsonConverter on a class without the attribute

查看:169
本文介绍了在全球范围内使用JsonConverter的一类无属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个MVC .NET项目,我使用MongoDB的。
我使用自定义JsonConverter序列化的ObjectId属性字符串,正如我在这个答案说明:
自动retun的MongoDB的ObjectId作为MVC 字符串Json.NET

I have a MVC .net project, and I am using mongodb. I use a custom JsonConverter to serialize ObjectId properties as a string, as I describes in this answer: Automatically retun mongodb ObjectId as string with Json.NET in MVC

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

In there I used an attribue so that the custom converter is used on a certain property: [JsonConverter(typeof(ObjectIdConverter))

有没有办法告诉串行使用ObjectIdConverter的类型的ObjectId的所有属性?
我不wan't走了过来对整个项目并添加该属性。

Is there a way to tell the serializer to use the ObjectIdConverter on all properties of type ObjectId? I don't wan't to go over on the entire project and add this property.

谢谢!

推荐答案

是的,你可以使用自定义 IContractResolver 来编程应用 JsonConverter 类或属性。要做到这一点最简单的方法是从 DefaultContractResolver 类派生您的解析器,然后覆盖适当的方法。下面是指示Json.Net使用一个 ObjectIdConverter 上的所有实例的的ObjectId 键入一个例子解析器,无论一下班,他们可能会出现在

Yes, you can use a custom IContractResolver to programmatically apply a JsonConverter to a class or property. The simplest way to do this is to derive your resolver from the DefaultContractResolver class and then override the appropriate method. Below is an example resolver that instructs Json.Net to use an ObjectIdConverter on all instances of the ObjectId type, regardless of what class they might appear in.

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 实例。

To use the resolver, you can construct a JsonSerializer instance and set the ContractResolver property on it, then use that instance to do your serialization/deserialization. If you are using JObject.ToObject() and JObject.FromObject(), note that both methods have overloads that accept a JsonSerializer instance.

JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();

JObject jo = JObject.FromObject(foo, serializer);

另外,如果您使用的是 JsonConvert 类做你的序列化/反序列化,你可以创建 JsonSerializerSettings ,设置了 ContractResolver 属性,然后通过设置到 SerializeObject() DeserializeObject()方法。

Alternatively, if you are using the JsonConvert class to do your serialization/deserialization, you can create an instance of JsonSerializerSettings, set the ContractResolver property on that, then pass the settings to the SerializeObject() and DeserializeObject() methods.

JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();

Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);

希望这有助于。

这篇关于在全球范围内使用JsonConverter的一类无属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆