将JSON转为C#对象后,如何遍历CheckingUrls中的动态属性?
动态遍历JSON中的CheckingUrls项(无需硬编码C#属性)
问题背景
现有指定JSON结构,需要遍历CheckingUrls内的所有子项,但当前对应的C#类使用固定属性(APIManagement、LogAnalytics),后续JSON可能新增子节点,希望无需修改C#代码即可适配。
原JSON结构
{ "Root": { "Urls": { "CheckingUrls": [ { "API Management": { "url": ".azure-api.net", "displayurl": "*.azure-api.net" }, "Log Analytics": { "url": "1.ods.opinsights.azure.com", "displayurl": "*.ods.opinsights.azure.com" } } ] } } }
原C#类定义
public class Root { public Urls Urls { get; set; } } public class Urls { public List<CheckingUrls> CheckingUrls { get; set; } } public class CheckingUrls { [JsonProperty("API Management")] public UrlDetails APIManagement { get; set; } [JsonProperty("Log Analytics")] public UrlDetails LogAnalytics { get; set; } } public class UrlDetails { [JsonProperty("url")] public string url { get; set; } [JsonProperty("displayurl")] public string displayurl { get; set; } }
原反序列化代码
var content = File.ReadAllText(jsonstring); var settings = JsonConvert.DeserializeObject<Root>(content);
解决方案:改用Dictionary<string, UrlDetails>替代固定属性
核心思路是将CheckingUrls对应的类型从自定义类改为Dictionary<string, UrlDetails>,这样JSON中CheckingUrls数组内的每个对象都会被反序列化为键值对(键为节点名称,值为UrlDetails对象),无需硬编码任何属性,后续新增JSON节点也能自动适配。
修改后的C#类定义
public class Root { public Urls Urls { get; set; } } public class Urls { // 将List<CheckingUrls>替换为List<Dictionary<string, UrlDetails>> public List<Dictionary<string, UrlDetails>> CheckingUrls { get; set; } } public class UrlDetails { [JsonProperty("url")] public string Url { get; set; } [JsonProperty("displayurl")] public string DisplayUrl { get; set; } }
反序列化与遍历代码
var content = File.ReadAllText(jsonstring); var root = JsonConvert.DeserializeObject<Root>(content); // 遍历所有CheckingUrls内的节点 foreach (var urlDict in root.Urls.CheckingUrls) { foreach (var kvp in urlDict) { string serviceName = kvp.Key; // 例如"API Management"、"Log Analytics" UrlDetails details = kvp.Value; // 按需处理每个节点的数据 Console.WriteLine($"服务名称:{serviceName}"); Console.WriteLine($"URL:{details.Url}"); Console.WriteLine($"显示URL:{details.DisplayUrl}"); Console.WriteLine("---"); } }
关键说明
- 后续JSON新增任何子节点(如"Azure Storage"),反序列化后都会自动存入
Dictionary,完全无需修改C#类代码。 UrlDetails类保持不变,负责解析每个节点内的url和displayurl字段。
内容的提问来源于stack exchange,提问作者kudlatiger
相关产品推荐
相关产品推荐

