C# ASP.NET反序列化第三方汇率JSON后有模型无数据问题咨询
问题原因
你的实体类定义没有错误,问题出在反序列化的目标类型和JSON结构不匹配:
你获取的JSON外层是Root对象的数组,CurrencyDTO列表是存放在每个Root对象的currencies字段中的,你直接将返回结果反序列化为List<CurrencyDTO>,结构无法匹配,自然拿不到数据。
另外你的代码存在冗余逻辑:你先用HttpClient发送了请求,又用已过时的WebClient重复请求了一次相同接口,属于不必要的性能浪费,直接复用HttpClient的返回结果即可。
修正后的代码示例
推荐优先使用异步写法,避免.Result导致的线程死锁问题:
public async Task<IActionResult> Index() { List<CurrencyDTO> ct = new List<CurrencyDTO>(); HttpResponseMessage response = await client.GetAsync(BaseURL); if (response.IsSuccessStatusCode) { string rawJSON = await response.Content.ReadAsStringAsync(); // 先反序列化为对应结构的Root列表 var rootList = JsonConvert.DeserializeObject<List<Root>>(rawJSON); // 取出第一组数据的货币列表(该接口默认只返回一个日期的汇率数据) ct = rootList?.FirstOrDefault()?.currencies ?? new List<CurrencyDTO>(); } return View(ct); }
如果必须使用同步写法,调整为以下即可:
public IActionResult Index() { List<CurrencyDTO> ct = new List<CurrencyDTO>(); HttpResponseMessage response = client.GetAsync(BaseURL).Result; if (response.IsSuccessStatusCode) { string rawJSON = response.Content.ReadAsStringAsync().Result; var rootList = JsonConvert.DeserializeObject<List<Root>>(rawJSON); ct = rootList?.FirstOrDefault()?.currencies ?? new List<CurrencyDTO>(); } return View(ct); }
内容的提问来源于stack exchange,提问作者namizo
相关产品推荐
相关产品推荐

