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

求助:C#读取含嵌套动态属性的JSON遇到实现难题

兄弟,我太懂你这种碰到动态嵌套JSON键的憋屈了——明明知道数据结构的逻辑,但那些随机变的键(比如你说的3B00535EF2414332、212、6)根本没法用固定类的属性去对应,完全卡壳!别慌,给你几个实用的解决思路,都是C#里处理这类场景的常用方法:

方法一:用嵌套Dictionary映射

既然动态键本质就是键值对,那直接用多层Dictionary来对应嵌套结构就完事了。比如你的JSON是三层嵌套的动态键,就可以定义对应的Dictionary类型:

// 假设你的JSON结构是 外层动态键 -> 中层动态键 -> 内层动态键 -> 具体值
// 用Newtonsoft.Json(也就是Json.NET)解析的例子
string jsonContent = "你的JSON字符串";
var dynamicJson = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, Dictionary<string, string>>>>(jsonContent);

// 遍历所有动态键和对应的值
foreach (var outerKey in dynamicJson.Keys)
{
    var middleLayer = dynamicJson[outerKey];
    foreach (var middleKey in middleLayer.Keys)
    {
        var innerLayer = middleLayer[middleKey];
        foreach (var innerKey in innerLayer.Keys)
        {
            Console.WriteLine($"路径:{outerKey} → {middleKey} → {innerKey},值:{innerLayer[innerKey]}");
        }
    }
}

如果你的值类型不是字符串,把最后一层的string换成对应的类型就行,比如int或者object。

方法二:用JObject动态解析(Newtonsoft.Json)

要是你需要更灵活的操作(比如不确定层级、要随时判断节点类型),用JObject绝对是首选,它能让你像操作DOM一样遍历JSON:

var jObj = JObject.Parse(jsonContent);

// 遍历所有层级的动态键
foreach (var outerProp in jObj.Properties())
{
    var middleObj = outerProp.Value as JObject;
    if (middleObj != null)
    {
        foreach (var middleProp in middleObj.Properties())
        {
            var innerObj = middleProp.Value as JObject;
            if (innerObj != null)
            {
                foreach (var innerProp in innerObj.Properties())
                {
                    Console.WriteLine($"路径:{outerProp.Name} → {middleProp.Name} → {innerProp.Name},值:{innerProp.Value}");
                }
            }
        }
    }
}

// 要是你知道层级,哪怕不知道具体键,也可以直接取第一个匹配的节点
var firstValue = jObj.Properties().First().Value.Properties().First().Value.Properties().First().Value.ToString();
方法三:用System.Text.Json的JsonDocument(原生无依赖)

如果你不想引入第三方库,.NET Core及以上自带的System.Text.Json就够了,用JsonDocument来动态遍历:

using (JsonDocument doc = JsonDocument.Parse(jsonContent))
{
    JsonElement root = doc.RootElement;
    foreach (var outerNode in root.EnumerateObject())
    {
        if (outerNode.Value.ValueKind == JsonValueKind.Object)
        {
            foreach (var middleNode in outerNode.Value.EnumerateObject())
            {
                if (middleNode.Value.ValueKind == JsonValueKind.Object)
                {
                    foreach (var innerNode in middleNode.Value.EnumerateObject())
                    {
                        Console.WriteLine($"路径:{outerNode.Name} → {middleNode.Name} → {innerNode.Name},值:{innerNode.Value.GetString()}");
                    }
                }
            }
        }
    }
}

这些方法都不用纠结动态键的名称,直接按结构遍历或者按需取值就行,选哪个看你项目用的JSON库和实际需求~

内容的提问来源于stack exchange,提问作者Ahmed Õşşama

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:36:30