如何在嵌套JObject中根据指定app键获取对应库的path值
解决方法
假设你的JObject结构大致如下(以Steam的libraryfolders为例):
{ "libraryfolders": { "0": { "path": "C:\\Program Files (x86)\\Steam", "apps": { "12345": "..." } }, "1": { "path": "D:\\Programme\\Games\\Steam", "apps": { "945360": "..." } } } }
你可以用以下LINQ语句筛选出目标路径:
using Newtonsoft.Json.Linq; // 假设你的JObject实例名为steamConfig string targetAppId = "945360"; string targetPath = steamConfig["libraryfolders"] // 遍历libraryfolders下的所有library节点 .Cast<JProperty>() .Select(p => p.Value as JObject) // 筛选出apps属性中包含目标AppId的节点 .Where(library => library["apps"] is JObject apps && apps.ContainsKey(targetAppId)) // 提取path属性的值 .Select(library => library["path"]?.ToString()) // 取第一个匹配的结果(如果有多个可以用ToList()获取所有) .FirstOrDefault();
代码说明:
- 先通过
steamConfig["libraryfolders"]定位到库文件夹的根节点。 - 用
Cast<JProperty>()将节点转换为可遍历的属性集合(因为libraryfolders下的子节点是以"0"、"1"为键的属性)。 - 每个属性的值就是单个library的JObject,通过
Select(p => p.Value as JObject)提取出来。 Where条件里先判断apps是否为JObject,再检查是否包含目标AppId键。- 最后提取
path的字符串值,用FirstOrDefault()获取第一个匹配的结果(如果有多个符合条件的库,可改用ToList()获取全部)。
内容的提问来源于stack exchange,提问作者sirzento
相关产品推荐
相关产品推荐

