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

将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:05:52