You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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();

说明:

  1. 先把整个JSON解析为JObject,避免在循环/Select中重复解析,提升性能;
  2. 通过Select遍历"rec"对应的每个角色令牌,提取角色名称后,直接从secrets节点中获取对应的"prod"字段值;
  3. 最终直接得到包含所有prod密钥的List<string>,代码更紧凑,可读性也更强。

内容的提问来源于stack exchange,提问作者Sravani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:50:23