我有一个 MVC .net 项目,我正在使用 mongodb。 我使用自定义 JsonConverter 将 ObjectId 属性序列化为字符串,正如我在此答案中所述: Automatically retun mongodb ObjectId as string with Json.NET in MVC
在那里我使用了一个属性,以便在某个属性上使用自定义转换器:[JsonConverter(typeof(ObjectIdConverter))
有没有办法告诉序列化程序对 ObjectId 类型的所有属性使用 ObjectIdConverter? 我不想回顾整个项目并添加此属性。
谢谢!
最佳答案
是的,您可以使用自定义 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);
希望这会有所帮助。
关于c# - 在没有属性的类上全局使用 JsonConverter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27332258/