求助: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
相关产品推荐
相关产品推荐

