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)
您可以将 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
您还可以使用 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)
| 归档时间: |
|
| 查看次数: |
5952 次 |
| 最近记录: |