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
相关产品推荐
相关产品推荐

