You need to enable JavaScript to run this app. 如何使用System.Text.Json将蛇形键JSON反序列化到多个自定义类
优惠活动
大模型
产品
解决方案
定价
更多

如何使用System.Text.Json将蛇形键JSON反序列化到多个自定义类

使用System.Text.Json反序列化扁平化键到嵌套类的解决方案

你的场景属于扁平化带规则命名的JSON根键映射到嵌套C#类结构,核心实现方式是自定义JsonConverter<T>,无需为1000个键单独声明JsonPropertyName特性,只要键的命名规则统一即可批量处理。

实现步骤

  1. 首先实现针对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();
    }
}
  1. 反序列化时注册转换器即可使用
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 16:06:02