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

时间:2014-12-06 13:35:30

标签: 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? 我不想回顾整个项目并添加这个属性。

谢谢!

1 个答案:

答案 0 :(得分:9)

是的,您可以使用自定义IContractResolver以编程方式将JsonConverter应用于类或属性。最简单的方法是从DefaultContractResolver类派生您的解析器,然后覆盖适当的方法。下面是一个示例解析器,指示Json.Net在ObjectIdConverter类型的所有实例上使用ObjectId,无论它们出现在哪个类中。

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);

希望这有帮助。