dor*_*ach 6 c# asp.net-mvc json.net mongodb
我有一个MVC .net项目,我正在使用mongodb.我使用自定义JsonConverter将ObjectId属性序列化为字符串,正如我在这个答案中描述的那样: 在MVC中自动将mongodb ObjectId作为字符串与Json.NET一起使用
在那里我使用了一个属性,以便自定义转换器用于某个属性: [JsonConverter(typeof(ObjectIdConverter))
有没有办法告诉序列化器在ObjectId类型的所有属性上使用ObjectIdConverter?我不想继续讨论整个项目并添加这个属性.
谢谢!
是的,您可以使用自定义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;
}
}
Run Code Online (Sandbox Code Playgroud)
要使用解析程序,您可以构造一个JsonSerializer实例并ContractResolver在其上设置属性,然后使用该实例进行序列化/反序列化.如果使用的是 JObject.ToObject()和JObject.FromObject(),请注意,这两种方法有接受过载JsonSerializer实例.
JsonSerializer serializer = new JsonSerializer();
serializer.ContractResolver = new CustomResolver();
JObject jo = JObject.FromObject(foo, serializer);
Run Code Online (Sandbox Code Playgroud)
或者,如果您使用JsonConvert该类进行序列化/反序列化,则可以创建一个实例JsonSerializerSettings,在其ContractResolver上设置属性,然后将设置传递给SerializeObject()和DeserializeObject()方法.
JsonSerializerSettings settings = new JsonSerializerSettings();
settings.ContractResolver = new CustomResolver();
Foo foo = JsonConvert.DeserializeObject<Foo>(json, settings);
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.