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

我有一个MVC .net项目,我正在使用mongodb。 我使用自定义JsonConverter将ObjectId属性序列化为字符串,正如我在这个答案中描述的那样: 在MVC中自动将mongodb ObjectId作为字符串与Json.NET一起重新编写

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

有没有办法告诉序列化器在ObjectId类型的所有属性上使用ObjectIdConverter? 我不想继续讨论整个项目并添加这个属性。

谢谢!

是的,您可以使用自定义IContractResolver以编程方式将JsonConverter应用于类或属性。 最简单的方法是从DefaultContractResolver类派生您的解析器,然后覆盖适当的方法。 下面是一个示例解析器,它指示Json.Net在ObjectId类型的所有实例上使用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(json, settings); 

希望这可以帮助。