You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:30:11