如何无需自定义反序列化器将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
相关产品推荐
相关产品推荐

