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

使用Json.NET解析嵌套JObject中动态键的hashrateString问题

使用Json.NET获取JSON动态键下的指定字段

我正在使用Json.NET,以下是我的JSON数据:

{
  "miner": "t1biSMuXyq5eKkP8zDPViKHF9mbS9ZFLRuF",
  "totalHash": 1523943880.832757,
  "totalShares": 4089.53223605,
  "networkSols": "7644579",
  "immature": 0.29784511,
  "balance": 0,
  "paid": 1092.22974323,
  "workers": {
    "t1biSMuXyq5eKkP8zDPViKHF9mbS9ZFLRuF": {
      "name": "t1biSMuXyq5eKkP8zDPViKHF9mbS9ZFLRuF",
      "diff": 54500,
      "shares": 106.44625040000004,
      "invalidshares": 0,
      "currRoundShares": 4082.8793454,
      "currRoundTime": 0,
      "hashrate": 1523943880.832757,
      "hashrateString": "3.05 KSol/s",
      "luckDays": "5.574",
      "luckHours": "133.768",
      "paid": 1092.22974323,
      "balance": 0
    }
  },
  "history": {
    "t1biSMuXyq5eKkP8zDPViKHF9mbS9ZFLRuF": [
      { "time": 1516522247, "hashrate": 1600923951.4915187 },
      { "time": 1516526867, "hashrate": 1523943880.832757 }
    ]
  }
}

我想要获取workers下动态变化的键(如t1biSMuXyq5eKkP8zDPViKHF9mbS9ZFLRuF)内的hashrateString元素,但该键值每次都会变化。我的当前代码如下:

String dl = webClient.DownloadString("http://hushpool.cloud/api/worker_stats?t1biSMuXyq5eKkP8zDPViKHF9mbS9ZFLRuF");
JObject json = JObject.Parse(dl);
JObject workers = JObject.Parse(JObject.Parse(dl).SelectToken("workers").First.ToString());
label7.Text = (String)json.GetValue("balance");
label8.Text = (String)json.GetValue("pending");
label9.Text = (String)json.GetValue("paid");
label10.Text = (String)workers.GetValue("hashrateString");

我尝试过多种代码但都无效,恳请协助解决。


问题分析

你的核心问题是处理workers下的动态键——不需要知道具体键名,只要获取对应对象里的hashrateString即可。当前代码里重复解析JSON对象的做法不仅冗余,而且处理动态键的方式不正确。另外注意你的代码里用了"pending",但JSON里对应的字段是"immature",这也会导致取值失败。

解决代码

下面是修正后的代码,直接通过JObject的属性集合来获取动态键对应的对象:

string dl = webClient.DownloadString("http://hushpool.cloud/api/worker_stats?t1biSMuXyq5eKkP8zDPViKHF9mbS9ZFLRuF");
JObject json = JObject.Parse(dl);

// 获取workers节点
JObject workers = (JObject)json["workers"];

// 获取workers下第一个动态键对应的worker对象(如果有多个worker可以遍历Properties())
JToken worker = workers.Properties().First().Value;

// 赋值各个标签
label7.Text = json["balance"].ToString();
label8.Text = json["immature"].ToString(); // 注意JSON里没有pending,是immature
label9.Text = json["paid"].ToString();
label10.Text = worker["hashrateString"].ToString();

关键说明

  1. 获取动态键对象:workers.Properties()会返回workers下所有键值对的集合,First()取第一个(如果你的场景下可能有多个worker,可以用foreach遍历这个集合)。
  2. 避免重复解析:只需要解析一次JSON字符串为JObject,后续直接从这个对象里取节点即可,不用多次调用JObject.Parse。
  3. 字段名匹配:确保代码里的字段名和JSON里的一致,比如把"pending"改成"immature",否则会得到null。

如果你的场景下workers可能有多个动态键,遍历的代码示例如下:

foreach (var prop in workers.Properties())
{
    JToken worker = prop.Value;
    string workerName = prop.Name; // 可以获取动态键的名称
    string hashrate = worker["hashrateString"].ToString();
    // 处理每个worker的逻辑
}

内容的提问来源于stack exchange,提问作者Tomaž

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:41:07