如何使用Newtonsoft.Json将键值对反序列化为列表?
没问题!我来给你一步步演示怎么用Newtonsoft.Json(也就是大家常说的Json.NET)把你提供的JSON响应里的国家键值对转成列表~
首先先看一下你给出的原始JSON响应:
{ "status": "SUCCESS", "message": "something", "data": { "trade_origin_iso3country": "GBR", "countries": { "ARM ": "Armenia", "BLR": "Belarus ", "DNK": "Denmark", "GBR": "United Kingdom", "MCO": "Monaco" } } }
方法一:使用实体类(推荐,类型安全)
这种方式适合需要完整解析整个响应的场景,类型安全,后续维护也更方便。
1. 定义对应结构的实体类
根据JSON的层级结构,我们需要创建三个类来匹配:
// 用来存储单个国家的代码和名称 public class CountryItem { public string Code { get; set; } public string Name { get; set; } } // 对应JSON里的"data"节点 public class ApiData { public string trade_origin_iso3country { get; set; } // 这里用Dictionary来接收countries的键值对 public Dictionary<string, string> countries { get; set; } } // 整个JSON响应的根对象 public class ApiResponse { public string status { get; set; } public string message { get; set; } public ApiData data { get; set; } }
2. 反序列化并转换为列表
接下来我们把JSON字符串反序列化为实体对象,再把字典转成我们需要的列表,顺便清理掉键值里的多余空格:
// 你的JSON响应字符串 string jsonResponse = @" { ""status"": ""SUCCESS"", ""message"": ""something"", ""data"": { ""trade_origin_iso3country"": ""GBR"", ""countries"": { ""ARM "": ""Armenia"", ""BLR"": ""Belarus "", ""DNK"": ""Denmark"", ""GBR"": ""United Kingdom"", ""MCO"": ""Monaco"" } } }"; // 反序列化整个JSON响应 var apiResponse = JsonConvert.DeserializeObject<ApiResponse>(jsonResponse); // 将countries字典转换为CountryItem列表,同时清理空格 List<CountryItem> countryList = apiResponse.data.countries .Select(kv => new CountryItem { Code = kv.Key.Trim(), Name = kv.Value.Trim() }) .ToList(); // 测试输出列表内容 foreach (var country in countryList) { Console.WriteLine($"国家代码:{country.Code},国家名称:{country.Name}"); }
方法二:无实体类的灵活写法
如果只需要提取countries部分,不想定义实体类,可以用JObject直接解析:
string jsonResponse = @"[你的JSON字符串]"; // 用JObject解析JSON JObject jsonObj = JObject.Parse(jsonResponse); // 获取countries节点 JObject countriesObj = (JObject)jsonObj["data"]["countries"]; // 转换为列表 List<CountryItem> countryList = countriesObj.Properties() .Select(prop => new CountryItem { Code = prop.Name.Trim(), Name = prop.Value.ToString().Trim() }) .ToList();
这种写法更轻便,适合快速提取特定部分的场景。
内容的提问来源于stack exchange,提问作者Bolaji
相关产品推荐
相关产品推荐

