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

C# 在没有属性的类上全局使用JsonConverter,c#,asp.net-mvc,mongodb,json.net,C#,Asp.net Mvc,Mongodb,Json.net,我有一个MVC.net项目,我正在使用mongodb。 我使用自定义JsonConverter将ObjectId属性序列化为字符串,如我在回答中所述: 在这里,我使用了属性,以便在特定属性上使用自定义转换器:[JsonConverter(typeof(objectedconverter)) 是否有方法告诉序列化程序在ObjectId类型的所有属性上使用ObjectdConverter? 我不想对整个项目进行检查并添加此属性 谢谢!是的,您可以使用自定义的IContractResolver以编程

我有一个MVC.net项目,我正在使用mongodb。 我使用自定义JsonConverter将ObjectId属性序列化为字符串,如我在回答中所述:

在这里,我使用了属性,以便在特定属性上使用自定义转换器:
[JsonConverter(typeof(objectedconverter))

是否有方法告诉序列化程序在ObjectId类型的所有属性上使用ObjectdConverter? 我不想对整个项目进行检查并添加此属性


谢谢!

是的,您可以使用自定义的
IContractResolver
以编程方式将
JsonConverter
应用于类或属性。最简单的方法是从
DefaultContractResolver
类派生冲突解决程序,然后重写相应的方法。下面是一个示例冲突解决程序,它指示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);
JsonSerializerSettings设置=新建JsonSerializerSettings();
settings.ContractResolver=新的CustomResolver();
Foo-Foo=JsonConvert.DeserializeObject(json,设置);

希望这有帮助。

试试BsonSerializer.RegisterIdgeGenerator(typeof(xxx),new xxxObjectIdgeGenerator());