C#(VS2017,.NET4.5)读取JSON提取Jane数据遇问题求助
解决方法:提取JSON中Jane的Math分数及权重
首先咱们来分析下你之前代码的问题:
- 第一个错误是因为
dynamic类型的特性,编译器无法在动态调度的操作中直接解析lambda表达式,所以obj.Properties().Select(...)会报错; - 第二个代码里把
JObject直接转成IEnumerable<dynamic>是不对的,JObject本身不是可枚举的属性集合,你需要调用Properties()方法来获取所有顶级属性,而且你的Select返回的是布尔值(判断每个属性名是不是Jane),所以First()取到的是第一个属性(John)的判断结果False,这显然不是你要的。
针对你的需求,这里有两种简单直接的实现方式:
方法1:利用dynamic直接访问(最简洁)
因为Newtonsoft.Json的JObject支持动态属性访问,你可以直接通过层级路径拿到目标值:
var source = System.IO.File.ReadAllText(@"C:\Data.json"); dynamic obj = JObject.Parse(source); // 获取Jane的Math数组:[["0.3",80]] dynamic janeMath = obj.Jane.Math; // 提取第一个子数组里的两个值 string weight = janeMath[0][0]; // "0.3" int score = janeMath[0][1]; // 80 Console.WriteLine($"Weight: {weight}, Score: {score}");
方法2:强类型操作(更安全,适合复杂场景)
如果不想用dynamic,可以用JObject的强类型API来操作,避免动态类型的潜在问题:
var source = System.IO.File.ReadAllText(@"C:\Data.json"); JObject obj = JObject.Parse(source); // 获取Jane的JToken JToken janeToken = obj["Jane"]; // 获取Math对应的JArray JArray mathArray = (JArray)janeToken["Math"]; // 取出第一个子数组 JArray firstMathItem = (JArray)mathArray[0]; string weight = firstMathItem[0].ToString(); // "0.3" // 转成int类型 int score = firstMathItem[1].Value<int>(); // 80 Console.WriteLine($"Weight: {weight}, Score: {score}");
两种方法都能准确提取到你需要的"0.3"和80,第一种更简洁,第二种在编译期有类型检查,适合复杂的JSON结构或者需要更严谨的场景。
内容的提问来源于stack exchange,提问作者Yusufmet
相关产品推荐
相关产品推荐

