如何在C#中使用变量访问嵌套JSON数据?
动态访问反序列化后机器人数据的实现方案
问题场景
你当前通过JsonConvert.DeserializeObject<Root>(json)反序列化了包含多个机器人的JSON数据,但代码只能固定访问data.dex,希望通过变量robot(存储用户选中的机器人名称,比如dex、dex_1)动态获取对应机器人的电池状态,之前尝试用GetMethod报错,需要可行的实现方法。
解决方案
方案1:将Root改为字典类型(推荐,类型安全)
因为你的JSON顶层是机器人名称-机器人数据的键值对结构,直接反序列化为Dictionary<string, Robot>可以通过键直接访问,无需反射:
首先定义对应的数据类:
public class CurrentJob { public object job { get; set; } public object task { get; set; } public object location { get; set; } } public class Battery { public string name { get; set; } public string status { get; set; } public string value { get; set; } } public class Robot { public CurrentJob current_job { get; set; } public Battery battery { get; set; } }
然后修改反序列化和访问逻辑:
// 反序列化为字典 var data = JsonConvert.DeserializeObject<Dictionary<string, Robot>>(json); var robotName = queryDetails2.Amr; var text = ""; // 安全获取对应机器人数据 if (data.TryGetValue(robotName, out var selectedRobot)) { if (selectedRobot.battery.status == "good") { text = $"{robotName}'s battery is in good condition."; } }
方案2:用反射访问现有Root类属性
如果无法修改Root类的定义,可以用反射获取对应属性(之前报错是因为误用GetMethod,应该用GetProperty,因为dex是属性而非方法):
var data = JsonConvert.DeserializeObject<Root>(json); var robotName = queryDetails2.Amr; var text = ""; // 获取Root类中对应机器人名称的属性 var robotProp = typeof(Root).GetProperty(robotName); if (robotProp != null) { var robot = robotProp.GetValue(data); // 获取battery属性 var batteryProp = robot.GetType().GetProperty("battery"); if (batteryProp != null) { var battery = batteryProp.GetValue(robot); // 获取status属性并判断 var statusProp = battery.GetType().GetProperty("status"); if (statusProp != null && statusProp.GetValue(battery)?.ToString() == "good") { text = $"{robotName}'s battery is in good condition."; } } }
方案3:使用JObject动态访问(无需提前定义类)
直接用Newtonsoft.Json的JObject解析JSON,灵活访问任意节点:
var jObj = JObject.Parse(json); var robotName = queryDetails2.Amr; var text = ""; // 直接通过键访问机器人节点 var robotNode = jObj[robotName]; if (robotNode != null && robotNode["battery"]["status"].ToString() == "good") { text = $"{robotName}'s battery is in good condition."; }
内容的提问来源于stack exchange,提问作者ycyc
相关产品推荐
相关产品推荐

