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

C#反序列化含未知字段名的JSON并获取字段名

反序列化动态字段名的JSON获取国家代码问题

我尝试反序列化API返回的JSON响应,需要提取iso对象内动态变化的字段名(比如阿富汗对应的af),但当前用Dictionary<string, ResponseFields>反序列化后,只能拿到Iso类型名称,无法获取实际的国家代码字段名。

示例JSON响应

{
   "afghanistan":{
      "iso":{
         "af":1
      },
      "prefix":{
         "+93":1
      },
      "text_en":"Afghanistan",
      "text_ru":"Афганистан",
      "virtual21":{
         "activation":1
      },
      "virtual23":{
         "activation":1
      },
      "virtual29":{
         "activation":1
      },
      "virtual30":{
         "activation":1
      },
      "virtual31":{
         "activation":1
      },
      "virtual32":{
         "activation":1
      },
      "virtual4":{
         "activation":1
      }
   }
}

当前反序列化代码

var response = JsonConvert.DeserializeObject<Dictionary<string, ResponseFields>>(json);

自动生成的实体类

public class ResponseFields
{
    public Iso iso { get; set; }
    public Prefix prefix { get; set; }
    public string text_en { get; set; }
    public string text_ru { get; set; }
    public Virtual21 virtual21 { get; set; }
    public Virtual23 virtual23 { get; set; }
    public Virtual29 virtual29 { get; set; }
    public Virtual30 virtual30 { get; set; }
    public Virtual31 virtual31 { get; set; }
    public Virtual32 virtual32 { get; set; }
    public Virtual4 virtual4 { get; set; }
}

public class Iso
{
    public int af { get; set; }
}

public class Prefix
{
    public int _93 { get; set; }
}

public class Virtual21
{
    public int activation { get; set; }
}

public class Virtual23
{
    public int activation { get; set; }
}

public class Virtual29
{
    public int activation { get; set; }
}

public class Virtual30
{
    public int activation { get; set; }
}

public class Virtual31
{
    public int activation { get; set; }
}

public class Virtual32
{
    public int activation { get; set; }
}

public class Virtual4
{
    public int activation { get; set; }
}

当前输出

Name: afghanistan
Code: Iso
Name: albania
Code: Iso
Name: algeria
Code: Iso

预期输出

Name: afghanistan
Code: af
Name: albania
Code: al
...

解决方法

核心修改:将固定字段类改为字典

问题根源是自动生成的Iso和Prefix类用了固定字段,无法适配动态变化的键名。把这两个类型替换为Dictionary<string, int>,就能直接捕获动态的国家代码和前缀字段名。

修改后的实体类

public class ResponseFields
{
    public Dictionary<string, int> iso { get; set; }
    public Dictionary<string, int> prefix { get; set; }
    public string text_en { get; set; }
    public string text_ru { get; set; }
    public Virtual21 virtual21 { get; set; }
    public Virtual23 virtual23 { get; set; }
    public Virtual29 virtual29 { get; set; }
    public Virtual30 virtual30 { get; set; }
    public Virtual31 virtual31 { get; set; }
    public Virtual32 virtual32 { get; set; }
    public Virtual4 virtual4 { get; set; }
}

// 以下Virtual类保持不变
public class Virtual21
{
    public int activation { get; set; }
}

public class Virtual23
{
    public int activation { get; set; }
}

public class Virtual29
{
    public int activation { get; set; }
}

public class Virtual30
{
    public int activation { get; set; }
}

public class Virtual31
{
    public int activation { get; set; }
}

public class Virtual32
{
    public int activation { get; set; }
}

public class Virtual4
{
    public int activation { get; set; }
}

提取国家代码的逻辑

反序列化后,遍历字典并取出iso字典的第一个键(根据示例,每个iso下只有一个键值对):

var response = JsonConvert.DeserializeObject<Dictionary<string, ResponseFields>>(json);
foreach (var countryEntry in response)
{
    string countryName = countryEntry.Key;
    string isoCode = countryEntry.Value.iso.Keys.FirstOrDefault();
    Console.WriteLine($"Name: {countryName}");
    Console.WriteLine($"Code: {isoCode}");
}

运行这段代码就能得到预期的输出结果。


内容的提问来源于stack exchange,提问作者juryvorpopen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 20:35:29