如何使用System.Text.Json将蛇形键JSON反序列化到多个自定义类
使用System.Text.Json反序列化扁平化键到嵌套类的解决方案
你的场景属于扁平化带规则命名的JSON根键映射到嵌套C#类结构,核心实现方式是自定义JsonConverter<T>,无需为1000个键单独声明JsonPropertyName特性,只要键的命名规则统一即可批量处理。
实现步骤
- 首先实现针对
Online类的自定义Json转换器
using System.Text.Json; using System.Text.Json.Serialization; using System.Reflection; public class OnlineJsonConverter : JsonConverter<Online> { public override Online? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { var jsonDoc = JsonDocument.ParseValue(ref reader); var root = jsonDoc.RootElement; var onlineObj = new Online { PVP = new PVP(), PVE = new PVE() }; // 遍历所有根级JSON属性 foreach (var prop in root.EnumerateObject()) { var key = prop.Name; // 按示例键规则拆分:[模块标识]_[属性名]:[后缀] var keyParts = key.Split(['_', ':']); if (keyParts.Length < 2) continue; var modulePart = keyParts[0].ToLower(); var propPart = keyParts[1].ToLower(); var value = prop.Value.GetInt32(); // 匹配模块和对应属性赋值 if (modulePart == "onlinepvp" && propPart == "kills") { onlineObj.PVP.Kills = value; } else if (modulePart == "onlinepve" && propPart == "kills") { onlineObj.PVE.Kills = value; } // 其余键按相同规则扩展匹配逻辑即可 } return onlineObj; } // 不需要序列化回JSON的情况下可空实现该方法 public override void Write(Utf8JsonWriter writer, Online value, JsonSerializerOptions options) { throw new NotImplementedException(); } }
- 反序列化时注册转换器即可使用
var options = new JsonSerializerOptions { Converters = { new OnlineJsonConverter() } }; // 你的JSON源字符串 string json = """ { "onlinepvp_kills:all": 0, "onlinepve_kills:all": 0 } """; var result = JsonSerializer.Deserialize<Online>(json, options);
批量处理优化
如果所有键的命名规则完全统一,可通过反射实现自动赋值,无需手动编写每个键的匹配逻辑:
- 拆分键名后,通过反射查找
Online类下的对应嵌套类实例 - 再查找嵌套实例下对应名称的属性自动赋值,1000个键也仅需要写一次通用逻辑即可覆盖。
内容的提问来源于stack exchange,提问作者Random
相关产品推荐
相关产品推荐

