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

C#反序列化JSON后PreExecute方法退出变量变空问题求助

问题分析与解决思路

核心原因:变量遮蔽+类型不匹配

你遇到的问题根源有两个:

  1. 局部变量遮蔽类字段:在PreExecute方法内部,你重新声明了同名的ahs局部变量(IEnumerable<AHS> ahs = ...),这导致类级别的private AHS ahs;字段根本没被赋值。局部变量仅在方法内部有效,方法执行完毕后就会被销毁,所以退出方法后类字段自然还是null。
  2. 类型不匹配:类字段的类型是AHS,但你反序列化得到的是IEnumerable<AHS>集合类型,就算没有遮蔽问题,直接赋值也会编译报错。

解决步骤

  1. 修正类字段类型:把类字段的类型改成和反序列化结果一致的集合类型:

    private IEnumerable<AHS> ahs; // 将原来的AHS改为IEnumerable<AHS>
    
  2. 移除局部变量声明,直接赋值给类字段:去掉方法内ahs的类型声明,直接给类字段赋值:

    // 移除前面的IEnumerable<AHS>,直接使用类字段
    ahs = JsonConvert.DeserializeObject<IEnumerable<AHS>>(json);
    

额外代码优化建议

  1. 清理冗余代码:你声明了HttpClient但完全未使用,直接删除这段代码即可。

  2. 确保资源释放:HttpWebResponse和Stream需要用using包裹,避免资源泄漏:

    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
    {
        using (Stream respStream = response.GetResponseStream())
        {
            using (StreamReader reader = new StreamReader(respStream))
            {
                json = reader.ReadToEnd();
            }
        }
    }
    

    (注:StreamReader的Close()无需手动调用,using块会自动处理资源释放)

  3. 改用HttpClient简化代码:HttpWebRequest写法繁琐,推荐用HttpClient实现相同逻辑,代码更简洁且自动处理资源:

    // 替换原来的HttpWebRequest代码
    using (HttpClient client = new HttpClient())
    {
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
        string json = await client.GetStringAsync(dataUrl);
        ahs = JsonConvert.DeserializeObject<IEnumerable<AHS>>(json);
    }
    

    (如果方法允许异步,建议用async/await;同步场景可使用.Result,但异步实现更优)

  4. 异常后状态处理:在catch块中,可以给ahs赋值空集合(比如ahs = Enumerable.Empty<AHS>();),避免后续代码处理null时抛出异常。


内容的提问来源于stack exchange,提问作者AMN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:46:25