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

如何无需自定义反序列化器将JSON字典反序列化为不同C#类型?

使用System.Text.Json反序列化多类型字典对象

实现方案

不用编写自定义反序列化器的话,可以通过两步处理完成:先将整个JSON反序列化为Dictionary<string, JsonElement>,再根据每个元素的mainType字段,单独反序列化为对应具体类型。

步骤1:定义对应的数据类型

先为每个mainType创建对应的C#类,示例如下:

public class Type1
{
    public string mainType { get; set; }
    // Type1专属属性
    public string Type1SpecificProp { get; set; }
}

public class Type2
{
    public string mainType { get; set; }
    // Type2专属属性
    public int Type2SpecificProp { get; set; }
}

// 同理定义Type3、Type4、Type5等类型

步骤2:反序列化为JsonElement字典

先把JSON字符串转成键为字符串、值为JsonElement的字典,保留原始JSON结构以便后续解析:

var jsonContent = @"{""KEY1"": { ""mainType"": ""TYPE1"", ""Type1SpecificProp"": ""demo"" }, ""KEY2"": { ""mainType"": ""TYPE2"", ""Type2SpecificProp"": 456 }}";
var rawDict = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(jsonContent);

步骤3:根据mainType分发反序列化

遍历字典中的每个元素,读取mainType的值,再转成对应的具体类型:

foreach (var entry in rawDict)
{
    var typeTag = entry.Value.GetProperty("mainType").GetString();
    switch (typeTag)
    {
        case "TYPE1":
            var type1Instance = JsonSerializer.Deserialize<Type1>(entry.Value);
            // 处理Type1实例逻辑
            break;
        case "TYPE2":
            var type2Instance = JsonSerializer.Deserialize<Type2>(entry.Value);
            // 处理Type2实例逻辑
            break;
        case "TYPE3":
            var type3Instance = JsonSerializer.Deserialize<Type3>(entry.Value);
            // 处理Type3实例逻辑
            break;
        // 依次处理TYPE4、TYPE5等类型
        default:
            // 处理未知类型的 fallback 逻辑
            break;
    }
}

注意事项

  • JSON中的重复键(比如示例里的两个KEY4)会被解析器覆盖,最终只保留最后一个键值对,这是JSON规范的默认处理行为。
  • 如果需要统一存储不同类型的实例,可以定义一个基类(如BaseDataType),让所有具体类型继承它,之后将实例存入Dictionary<string, BaseDataType>或List<BaseDataType>中。

内容的提问来源于stack exchange,提问作者Kyle B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:33:32