gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:26:10 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com