为何无法将字符串反序列化为指定模型?技术求助
问题分析与解决
核心问题点
- 异步调用错误:
response.Content.ReadAsStringAsync()未使用await,直接调用.Result会造成不必要的阻塞,还可能引发异步上下文相关问题。 - 类结构与JSON不匹配:
- 若
last_value的内容是硬件点位数组(格式类似[{"SpotId":1,"Occupied":"Yes"},...]),却尝试反序列化为IList<HardwareUpdateSpot>,类型完全不对应。 HardwareUpdateSpot类仅提供带参构造函数,Json.NET默认无法直接反序列化这类类,需添加无参构造函数或标记构造函数为JSON序列化可用。
- 若
修正后的代码
public async Task<IList<HardWareModel>> UpdateSpotHTTP() { using var client = new HttpClient(); // 用using自动释放资源 var response = await client.GetAsync( "https://io.adafruit.com/api/v2/Corey673/feeds/673d855c-9f66-4e49-8b2c-737e829d880c"); response.EnsureSuccessStatusCode(); // 确保请求成功,否则抛出异常 var responseHTTP = await response.Content.ReadAsStringAsync(); // 正确使用await var j = JObject.Parse(responseHTTP); var lastValue = j.GetValue("last_value")?.ToString(); if (string.IsNullOrEmpty(lastValue)) { return new List<HardWareModel>(); // 处理空值场景 } // 假设last_value是HardWareModel的数组,直接反序列化为List<HardWareModel> var dataObjects = JsonConvert.DeserializeObject<List<HardWareModel>>(lastValue); return dataObjects ?? new List<HardWareModel>(); } public record HardWareModel { public int SpotId { get; set; } public string Occupied { get; set; } } // 若last_value是包含Spots数组的对象(格式类似{"Spots": [...]}),则修改HardwareUpdateSpot如下: public class HardwareUpdateSpot { public IList<HardWareModel> Spots { get; set; } // 添加无参构造函数 public HardwareUpdateSpot() { } public HardwareUpdateSpot(IList<HardWareModel> spots) { Spots = spots; } }
额外说明
- 先确认
last_value的实际JSON结构:调试时输出lastValue的值,判断是数组还是包含数组的对象。 - 若
last_value是包含Spots的对象,反序列化时改用JsonConvert.DeserializeObject<HardwareUpdateSpot>(lastValue),最终返回dataObjects.Spots即可。 - 用
using包裹HttpClient可避免资源泄漏。 - 添加
response.EnsureSuccessStatusCode()能及时捕获HTTP请求失败的情况。
内容的提问来源于stack exchange,提问作者Corey673
相关产品推荐
相关产品推荐

