如何通过调用JsonConvert.DeserializeObject并禁用应用于基类型的JsonConverter?

编辑:澄清问题:

我已经覆盖了JsonConverter的基类型(通过将[JsonConverter(typeof(TConverter))]到超类中,但是当直接反序列化子类型时,我想使用STANDARD序列化(即没有自定义转换器)来反序列化我的派生宾语。 如何在deserialize方法中指定STANDARD序列化,就像我没有覆盖JsonConverter一样?

我使用弹性搜索,不能使用我自定义的JsonConverter实现调用JsonConvert.DeserializeObject,并且必须依赖Elastic的属性才能使用我的转换器。

但是,使用此转换器作为属性似乎也会影响所有子类,但我只是希望它们使用标准转换器,因此我不必为许多实现中的每一个实现JsonConverter。

这是我希望它看起来的类/逻辑:

  [Route("test")] [HttpPost] public HttpResponseMessage Test([FromBody] JToken json) { var res = json.ToObject(); // I want an object of ProductImpl type here return Request.CreateResponse(res); } [JsonConverter(typeof(JsonProductConverted))] public abstract class Product { } public class ProductImpl : Product { } public class JsonProductConverted : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JObject json = JObject.Load(reader); //var type = GetTypeFromId((int) json["typeId"]); // Construct type from field in var type = typeof(ProductImpl); // var res = JsonConvert.DeserializeObject(json.ToString(), type, DEFAULT_JSONCONVERTER_HERE); var res = DeserializeToObjectWithStandardJsonConverter(json, type); return res; } public override bool CanConvert(Type objectType) { return false; } } 

如果我不提供默认的JsonConverter,或类似的,它只会使用JsonProductConverted转换器,它会创建一个无限循环。

由于您已将[JsonConverter(typeof(JsonProductConverted))]直接添加到Product类型,因此可以向ProductImpl添加一个虚拟转换器,该转换器从CanReadCanWrite返回false

 [JsonConverter(typeof(NoConverter))] public class ProductImpl : Product { } public class NoConverter : JsonConverter { public override bool CanConvert(Type objectType) { return false; } public override bool CanRead { get { return false; } } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override bool CanWrite { get { return false; } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } } 

样本.Net小提琴 。

另一种选择是使用serializer.Populate() 。 这样可以避免对对象本身调用转换器:

 public class JsonProductConverted : JsonTypeInferringConverterBase { protected override Type InferType(Type objectType, JObject json) { //var type = GetTypeFromId((int) json["typeId"]); // Construct type from field in return typeof(ProductImpl); } public override bool CanConvert(Type objectType) { return false; } } public abstract class JsonTypeInferringConverterBase : JsonConverter { public override bool CanWrite { get { return false; } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } protected abstract Type InferType(Type objectType, JObject json); public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; var json = JObject.Load(reader); var actualType = InferType(objectType, json); // Construct object (or reuse existingValue if compatible) if (existingValue == null || !actualType.IsAssignableFrom(existingValue.GetType())) { var contract = (JsonObjectContract)serializer.ContractResolver.ResolveContract(actualType); existingValue = contract.DefaultCreator(); } // Populate object. using (var subReader = json.CreateReader()) { serializer.Populate(subReader, existingValue); } return existingValue; } } 

样品小提琴#2 。