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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:36:34