C# 在另一个JObject中解析JObject

C# 在另一个JObject中解析JObject,c#,json,json.net,C#,Json,Json.net,我使用的是Json.net,这是我的Json: { "miner": "t1biSMuXyq5eKkP8zDPViKHF9mbS9ZFLRuF", "totalHash": 1523943880.832757, "totalShares": 4089.53223605, "networkSols": "7644579", "immature": 0.29784511, "balance": 0, "paid": 1092.22974323,

我使用的是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”和“t1bibiusyq5ekkp8zdpvikhf9mbs9zflruf”中获取元素hashrateString,但“t1biusyq5ekp8zdpvikhf9mbs9zflruf”每次都会更改

这是我当前的代码:

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");

我试过不同的代码,但都没用。你们能帮帮我吗?

因为
minerValue
不是常量,所以首先需要从json中获取它,并使用它遍历
JObject
以获取
hashrateString

JObject obj = JObject.Parse(json);
JObject workers = (JObject)obj.GetValue("workers");
string minerValue = obj.GetValue("miner").ToString();
JObject minerWorker = (JObject)workers.GetValue(minerValue);
string hashRate = minerWorker.GetValue("hashrateString").ToString();
更新: 根据您的注释,如果存在属性名称略有不同的场景,则可以使用以下代码获取对象:

JObject workerMiner = (JObject)workers.Properties().FirstOrDefault(p => p.Name.StartsWith(minerValue)).Value;

请记住,由于您需要处理转角/故障情况(例如,json中不存在worker或miner属性),因此此代码尚未准备好生产。

这里有另一种方法可以使用jsonpath从json文本中检索
'hashratestring'

JObject obj = JObject.Parse(jsonTxt);
string name = (string)obj.SelectToken("$.workers.*.hashrateString");
Console.WriteLine(name);
输出:

3.05 KSol/s

的工作示例中,我将json简化为基本内容,并对其进行了一些格式化,以便于理解。如果您觉得缺少什么,请将其放回原处。问题是“矿工”值与第一个工人的值不一致。在某些情况下,“矿工”值可以是:t1bibirosyq5ekp8zdpvikhf9mbs9zflruf,但“工人”中的第一个元素可以是:t1birosyq5ekp8zdpvikhf9mbs9zflruf。worker1@TomažČuk请查看更新的答案,基本上
workers
对象将被遍历,第一个属性以“t1bibirosyq5ekkp8zdpvikhf9mbs9zflruf”开头谢谢,这是我一直在找的东西!