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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:25:23