如何高效将JArray转换为仅含KeyICareAbout值的列表?
提取JArray中指定键值的简便方法
问题背景
我有如下结构的JArray:
[ { "1": "A", "2": "B", "3": { "5": "D", "KeyICareAbout": "C" } }, { "1": "E", "2": "F", "3": { "5": "H", "KeyICareAbout": "G" } } ]
我仅关注KeyICareAbout对应的值,想要移除所有其他JToken并将该数组转换为列表。由于数组可能规模较大,担心循环效率不高,目前的实现感觉复杂且脆弱,想找到更简便的解决方案:
// 扁平化JArray并转换为Lookup,用路径最后一段作为键 var lookup = array.Descendants().OfType<JValue>().ToLookup(jv => jv.Path.Substring(jv.Path.LastIndexOf(".")+1), jv => jv.Value); // 将Lookup转换为列表 var list = lookup["KeyICareAbout"].ToList();
更高效简洁的解决方案
方法一:直接定位固定节点路径
如果JSON结构固定,直接遍历数组元素并精准定位目标键是性能最优的方式:
var list = array.Select(item => item["3"]["KeyICareAbout"].Value<string>()).ToList();
- 优势:仅访问需要的节点,避免遍历整个JSON结构的所有元素,性能开销极小;逻辑直白清晰,不会误匹配其他层级的同名键。
方法二:使用JsonPath灵活查询
如果JSON结构可能存在变动,或者需要匹配所有层级的KeyICareAbout,可以用JsonPath语法实现灵活查询:
var list = array.SelectTokens("$..KeyICareAbout").Values<string>().ToList();
- 解释:
$..KeyICareAbout是JsonPath表达式,表示匹配JSON中所有层级下的KeyICareAbout键;Values<string>()直接提取对应的值并转换为字符串列表。 - 优势:无需硬编码中间节点路径,适配结构更灵活的场景,同时性能远优于遍历所有Descendants的方式。
原方案的问题
原方案中Descendants().OfType<JValue>()会遍历整个JSON结构的所有值节点,当数组规模较大时会产生不必要的性能浪费;另外如果其他层级存在同名的KeyICareAbout键,会误将那些值也纳入结果,逻辑精准度不足。
内容的提问来源于stack exchange,提问作者Traceur
相关产品推荐
相关产品推荐

