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

为何无法将字符串反序列化为指定模型?技术求助

问题分析与解决

核心问题点

  1. 异步调用错误:response.Content.ReadAsStringAsync()未使用await,直接调用.Result会造成不必要的阻塞,还可能引发异步上下文相关问题。
  2. 类结构与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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 15:00:53