如何用C#的JSON.net解析含数字键JSON获取TestCycleName值
用C#结合Json.NET解析带数字键的JSON并提取TestCycleName字段
我完全懂你遇到的这个麻烦——JSON里的Parameters节点用数字当键,直接用普通的类映射确实会卡壳。不过别担心,用Json.NET(Newtonsoft.Json)有两种很顺手的方案,我给你一步步讲清楚:
方案一:强类型绑定(用Dictionary处理数字键)
这种方式适合你需要结构化处理整个JSON的场景,我们可以把Parameters定义成Dictionary<string, CycleInfo>,因为JSON里的数字键本质上都是字符串类型,Json.NET会自动帮我们完成映射。
首先定义对应的实体类:
// 对应Parameters下每个子节点的结构 public class CycleInfo { public string VersionName { get; set; } public string TestCycleName { get; set; } } // 对应整个JSON的根结构 public class ApiResponse { public string URL { get; set; } public string Method { get; set; } public Dictionary<string, CycleInfo> Parameters { get; set; } }
接下来是解析和提取的代码:
// 替换成你的实际JSON字符串 string json = @"{""URL"": ""rest/zapi/latest/cycle?projectId=##projectId##&versionId=##versionId##"", ""Method"": ""GET"", ""Parameters"": { ""1"": { ""VersionName"": ""Custom Pipes Development"", ""TestCycleName"": ""SetMaxFutureDateFromCustomerField_Mobile"" }, ""2"": { ""VersionName"": ""Recurring payments 1.5"", ""TestCycleName"": ""Internet Full Regression Pack - Mobile"" }, ""3"": { ""VersionName"": ""Customer Profile Phase 1.5"", ""TestCycleName"": ""Customer Profile Regression Pack - Desktop"" }, ""4"": { ""VersionName"": ""Customer Profile Phase 1.5"", ""TestCycleName"": ""Customer Profile E2E Pack - Desktop"" }, ""5"": { ""VersionName"": ""Customer Profile Phase 1.5"", ""TestCycleName"": ""Customer Profile Regression Pack - Mobile"" }, ""6"": { ""VersionName"": ""Internet Phase 1.2"", ""TestCycleName"": ""Internet API Regression Pack"" }, ""7"": { ""VersionName"": ""Internet Phase 1.2"", ""TestCycleName"": ""Internet GUI Regression Pack - Desktop"" }, ""8"": { ""VersionName"": ""Internet Phase 1.2"", ""TestCycleName"": ""Internet GUI Regression Pack - Mobile"" }, ""9"": { ""VersionName"": ""Internet Phase 1.2"", ""TestCycleName"": ""Regression Library Admin Tool - E2E Tests"" }, ""10"": { ""VersionName"": ""Internet Phase 1.2"", ""TestCycleName"": ""Regression Library E2E Tests - Mobile"" }, ""11"": { ""VersionName"": ""Recurring payments 1.5"", ""TestCycleName"": ""[Internet] Autopay API Automation Regression Pack"" } } }"; // 反序列化到强类型对象 var apiResponse = JsonConvert.DeserializeObject<ApiResponse>(json); // 遍历所有Parameters节点,提取TestCycleName foreach (var entry in apiResponse.Parameters) { Console.WriteLine($"编号{entry.Key}的测试周期名称:{entry.Value.TestCycleName}"); } // 如果你需要获取特定编号的TestCycleName,比如编号3 if (apiResponse.Parameters.TryGetValue("3", out var targetCycle)) { Console.WriteLine($"编号3的测试周期名称:{targetCycle.TestCycleName}"); }
方案二:动态解析(用JObject灵活处理)
如果不需要整个JSON的结构化绑定,只是想快速提取TestCycleName,用JObject动态解析会更轻便,不需要提前定义实体类:
// 同样替换成你的实际JSON字符串 string json = @"{""URL"": ""rest/zapi/latest/cycle?projectId=##projectId##&versionId=##versionId##"", ""Method"": ""GET"", ""Parameters"": { ""1"": { ""VersionName"": ""Custom Pipes Development"", ""TestCycleName"": ""SetMaxFutureDateFromCustomerField_Mobile"" }, ... }}"; // 解析成JObject var rootObj = JObject.Parse(json); // 获取Parameters节点 var parametersObj = (JObject)rootObj["Parameters"]; // 遍历所有子节点提取TestCycleName foreach (var prop in parametersObj.Properties()) { string testCycleName = (string)prop.Value["TestCycleName"]; Console.WriteLine($"编号{prop.Name}的测试周期名称:{testCycleName}"); } // 获取特定编号的TestCycleName,比如编号5 string specificCycleName = (string)parametersObj["5"]["TestCycleName"]; Console.WriteLine($"编号5的测试周期名称:{specificCycleName}");
为什么这两种方法可行?
JSON的键本质上都是字符串类型,哪怕你写的是数字,Json.NET也会把它当作字符串处理。用Dictionary<string, T>就能完美承接这些数字键;而JObject则是直接以键值对的形式处理JSON节点,不管键是数字还是字符串都能直接访问。
你可以根据自己的场景选择方案:如果需要反复使用整个JSON的数据,强类型绑定更靠谱;如果只是临时提取字段,动态解析更快捷。
内容的提问来源于stack exchange,提问作者mach
相关产品推荐
相关产品推荐

