C# 通过多级数组仅根据Key名称查找JSON值

use*_*278 3 c# linq json json.net

我有各种输入 JSON 格式的数据,它们都包含特定的 key-name terminalSize。这是我唯一知道的作品。JSON 树的总数或terminalSizeJSON 树内部的确切深度将永远是未知的,并且可能会发生变化。

我正在寻找一个 C# 解决方案来循环遍历 JSON 字符串的每个子级并查找terminalSize然后获取值。

我已经成功尝试过此操作,但只有terminalSize在 JSON 的第一级时它才有效:

var list = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(jsonString);
var dict = list.SelectMany(d => d).ToDictionary(p => p.Key, p => p.Value);
var terminal = dict["terminalSize"];
Run Code Online (Sandbox Code Playgroud)

示例 1。

{
  "status": "success",
  "data": {
    "terminalSize": 3766505.46,
    "totalTerminalSize": 3766505.46
  },
  "message": null
}
Run Code Online (Sandbox Code Playgroud)

示例 2.

{
  "lastUpdated": 1588020678,
  "terminalData": {
    "terminalSize": "451679852",
    "totalTerminalSize": "2100000000"
  },
  "terminalValueSeries": {
    "8x7": 2.33,
    "8x6": 3.73,
    "8x5": 4.49,
    "8x4": 3.68,
    "8x3": 13998,
    "8x2": 274936,
    "8x1": 5.09
  }
}
Run Code Online (Sandbox Code Playgroud)

示例 3.

{
  "terminalSize": "492612346.17",
  "terminalStatus": "online"
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*ers 6

您可以将 JSON 解析为 a JToken,然后使用SelectToken递归下降JsonPath运算符..来获取terminalSizeJSON 中的任何位置:

var terminalSize = (double?) JToken.Parse(json).SelectToken("$..terminalSize");
Run Code Online (Sandbox Code Playgroud)

小提琴: https: //dotnetfiddle.net/5ziYbP

terminalSize如果JSON 中可能有多个键,例如,如果您有一个终端数组,则可以SelectTokens改为使用并将终端大小放入按Dictionary路径键控的路径中:

var sizes = JToken.Parse(json4)
                  .SelectTokens("$..terminalSize")
                  .ToDictionary(t => t.Path, t => (double)t);
Run Code Online (Sandbox Code Playgroud)

小提琴: https: //dotnetfiddle.net/ivSM88


Anu*_*wan 6

您还可以使用 linq 并JProperty根据JProperty.Name. 例如

var result = JObject.Parse(jsonString)
                    .DescendantsAndSelf()
                    .OfType<JProperty>()
                    .Single(x=>x.Name.Equals("terminalSize"))
                    .Value;
Run Code Online (Sandbox Code Playgroud)