使用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();
关键说明
- 获取动态键对象:
workers.Properties()会返回workers下所有键值对的集合,First()取第一个(如果你的场景下可能有多个worker,可以用foreach遍历这个集合)。 - 避免重复解析:只需要解析一次JSON字符串为
JObject,后续直接从这个对象里取节点即可,不用多次调用JObject.Parse。 - 字段名匹配:确保代码里的字段名和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ž
相关产品推荐
相关产品推荐

