如何在C#中使用LINQ读取JSON并获取指定环境密钥
问题:用LINQ简化JSON密钥提取逻辑
我需要从给定的JSON文件中,先获取role_to_secrets里"rec"对应的角色列表,再提取这些角色在"prod"环境下的密钥值。比如"rec"对应的角色是"resdns"、"dnsmoon"、"resmoon",要得到对应的prod密钥:"prod/user/res_dns.pub"、"prod/user/resdns.pub"、"prod/user/res_moon.pub"。
JSON示例:
{ "secrets":{ "resdns":{ "_type":"ssh_key", "_rotatable":false, "test":"test/user/res_dns.pub", "prod":"prod/user/res_dns.pub" }, "dnsmoon":{ "_type":"secret", "_rotatable":false, "test":"test/user/dnsmoon.pub", "prod":"prod/user/resdns.pub" }, "resmoon":{ "_type":"secret", "_rotatable":false, "test":"test/user/res_moon.pub", "prod":"prod/user/res_moon.pub" }, "rrservice":{ "_type":"secret", "_rotatable":false, "test":"test/user/rrs1ervice.pub", "prod":"prod/user/rrservice8.pub" }, "mds":{ "_type":"ssh_key", "_rotatable":false, "test":"test/user/mds.pub", "prod":"prod/user/mds.pub" } }, "role_to_secrets":{ "rec":[ "resdns", "dnsmoon", "resmoon" ], "kka":[ "resdns", "dnsmoon", "resmoon" ], "zoper":[ "rrservice", "mds" ] } }
目前我用传统循环实现:
List<string> lstRecursiveRoles = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(jsonContent["role_to_secrets"]["rec"].ToString()); List<string> lstSecretValue = new List<string>(); foreach (var recursiveRole in lstRecursiveRoles) { lstSecretValue.Add(jsonContent["secrets"][recursiveRole]["prod"].ToString()); }
请问有没有更简洁的LINQ实现方式?
解决方案:LINQ简化实现
可以通过一次JSON解析+LINQ的Select操作直接完成,既简洁又避免重复反序列化的开销:
// 先将JSON内容解析为JObject,只做一次解析 var jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject<Newtonsoft.Json.Linq.JObject>(jsonContent); // 用LINQ直接映射角色到对应的prod密钥 var lstSecretValue = jsonObj["role_to_secrets"]["rec"] .Select(roleToken => jsonObj["secrets"][roleToken.Value<string>()]["prod"].Value<string>()) .ToList();
说明:
- 先把整个JSON解析为
JObject,避免在循环/Select中重复解析,提升性能; - 通过
Select遍历"rec"对应的每个角色令牌,提取角色名称后,直接从secrets节点中获取对应的"prod"字段值; - 最终直接得到包含所有prod密钥的
List<string>,代码更紧凑,可读性也更强。
内容的提问来源于stack exchange,提问作者Sravani
相关产品推荐
相关产品推荐

