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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:04:09