使用C#从给定JSON字符串提取ID的最佳方法?
要在C#里从你提供的JSON中提取ID,这里有几种实用方法,其中强类型序列化是最推荐的方案——毕竟类型安全、可读性强,后续维护也省心:
方法一:强类型序列化(最佳实践)
首先根据JSON的结构,创建对应的C#实体类(字段名可以用C#规范的PascalCase,序列化库会自动匹配JSON的驼峰命名):
public class RootResponse { public int Count { get; set; } public List<ProjectItem> Value { get; set; } } public class ProjectItem { public int Id { get; set; } // 对应JSON里的value.id public string ProjectId { get; set; } public string Name { get; set; } public PoolInfo Pool { get; set; } } public class PoolInfo { public int Id { get; set; } // 对应JSON里的value.pool.id public string Scope { get; set; } public string Name { get; set; } public bool IsHosted { get; set; } public string PoolType { get; set; } }
使用内置的System.Text.Json(.NET Core 3.0+ / .NET 5+)
using System.Text.Json; // 你的JSON字符串 string json = "{ \"count\":1, \"value\": [ { \"id\":35, \"projectId\": \"frfsdf-039a-405b-8835-5ddb00cfsdf9f107\", \"name\":\"Default\", \"pool\":{ \"id\":1, \"scope\":\"8850710d-4558-4f08-8064-38000a03d209\", \"name\":\"Default\", \"isHosted\":false, \"poolType\":\"automation\" } }] }"; // 反序列化为强类型对象 var response = JsonSerializer.Deserialize<RootResponse>(json); // 提取需要的ID int projectItemId = response.Value[0].Id; // 结果:35 int poolId = response.Value[0].Pool.Id; // 结果:1
使用Newtonsoft.Json(Json.NET,兼容旧项目)
如果你的项目还在使用经典的Json.NET,代码几乎一致,只是换序列化方法:
using Newtonsoft.Json; var response = JsonConvert.DeserializeObject<RootResponse>(json); int projectItemId = response.Value[0].Id; int poolId = response.Value[0].Pool.Id;
方法二:动态类型(临时快速提取)
如果只是临时测试或者不想定义实体类,可以用动态类型,但缺点是没有编译时检查,一旦JSON结构变化容易报错:
System.Text.Json 动态方式
using System.Text.Json.Nodes; var jsonNode = JsonNode.Parse(json); int projectItemId = jsonNode["value"][0]["id"].GetValue<int>(); int poolId = jsonNode["value"][0]["pool"]["id"].GetValue<int>();
Newtonsoft.Json 动态方式
dynamic jsonObj = JsonConvert.DeserializeObject(json); int projectItemId = jsonObj.value[0].id; int poolId = jsonObj.value[0].pool.id;
方法三:直接定位字段(Newtonsoft.Json)
用JObject直接定位到目标字段,适合只提取个别字段的场景:
using Newtonsoft.Json.Linq; JObject jObj = JObject.Parse(json); int projectItemId = (int)jObj["value"][0]["id"]; int poolId = (int)jObj["value"][0]["pool"]["id"];
总结
强类型序列化是首选:它能在编译阶段就发现类型不匹配的问题,代码可读性和可维护性远高于动态方法,尤其适合生产环境。动态类型或JObject可以作为临时方案,但不建议在长期维护的项目中大量使用。
内容的提问来源于stack exchange,提问作者doorman
相关产品推荐
相关产品推荐

