如何基于JSON字段自动选择实现类进行Newtonsoft.Json反序列化?
基于字段匹配的Json.NET接口反序列化实现
核心思路
不用纠结JsonSerializerSettings.Binder(它主要用于类型名称与实际类型的映射),直接自定义类型转换器(JsonConverter),在反序列化时根据JSON对象的字段特征判断要实例化的具体类,完全贴合你的字段匹配需求。
步骤1:实现自定义JsonConverter
创建继承自JsonConverter<I_Interface>的转换器,在ReadJson方法里完成字段判断与类型实例化:
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; public class InterfaceConverter : JsonConverter<I_Interface> { public override I_Interface ReadJson(JsonReader reader, Type objectType, I_Interface existingValue, bool hasExistingValue, JsonSerializer serializer) { var jObject = JObject.Load(reader); // 匹配Jobs类的特征字段:同时存在action和quantity if (jObject.ContainsKey("action") && jObject.ContainsKey("quantity")) { return jObject.ToObject<Jobs>(serializer); } // 匹配Engine_Zone类的特征字段:存在zone else if (jObject.ContainsKey("zone")) { return jObject.ToObject<Engine_Zone>(serializer); } // 处理无法匹配的情况,可根据业务需求抛出异常或返回null throw new JsonSerializationException("无法识别的JSON对象类型"); } public override void WriteJson(JsonWriter writer, I_Interface value, JsonSerializer serializer) { // 若需支持接口对象序列化,可在此补充逻辑,本例仅关注反序列化 serializer.Serialize(writer, value); } }
步骤2:定义接口与实现类
按照你的需求定义基础接口与具体实现类:
// 基础接口INotification public interface INotification { } // 继承INotification的目标接口I_Interface public interface I_Interface : INotification { } // Jobs实现类 public class Jobs : I_Interface { public int Action { get; set; } public int Quantity { get; set; } } // Engine_Zone实现类 public class Engine_Zone : I_Interface { public int Zone { get; set; } }
步骤3:使用转换器完成反序列化
调用JsonConvert.DeserializeObject时,将自定义转换器传入配置项即可:
string input_JSON = @" [ {""action"": 1, ""quantity"" : 20}, {""action"": 2, ""quantity"" : 26}, {""zone"": 1} ]"; var settings = new JsonSerializerSettings { Converters = new[] { new InterfaceConverter() } }; List<I_Interface> result = JsonConvert.DeserializeObject<List<I_Interface>>(input_JSON, settings); // 验证结果:前两个为Jobs实例,最后一个为Engine_Zone实例 foreach (var item in result) { Console.WriteLine(item.GetType().Name); } // 输出: // Jobs // Jobs // Engine_Zone
补充说明
- 后续新增实现类时,只需在
ReadJson方法中添加对应的字段判断逻辑即可 - 可根据业务需求调整字段匹配规则(比如判断字段是否非空),提升匹配准确性
内容的提问来源于stack exchange,提问作者Dominique
相关产品推荐
相关产品推荐

