C#反序列化JSON后PreExecute方法退出变量变空问题求助
问题分析与解决思路
核心原因:变量遮蔽+类型不匹配
你遇到的问题根源有两个:
- 局部变量遮蔽类字段:在
PreExecute方法内部,你重新声明了同名的ahs局部变量(IEnumerable<AHS> ahs = ...),这导致类级别的private AHS ahs;字段根本没被赋值。局部变量仅在方法内部有效,方法执行完毕后就会被销毁,所以退出方法后类字段自然还是null。 - 类型不匹配:类字段的类型是
AHS,但你反序列化得到的是IEnumerable<AHS>集合类型,就算没有遮蔽问题,直接赋值也会编译报错。
解决步骤
修正类字段类型:把类字段的类型改成和反序列化结果一致的集合类型:
private IEnumerable<AHS> ahs; // 将原来的AHS改为IEnumerable<AHS>移除局部变量声明,直接赋值给类字段:去掉方法内
ahs的类型声明,直接给类字段赋值:// 移除前面的IEnumerable<AHS>,直接使用类字段 ahs = JsonConvert.DeserializeObject<IEnumerable<AHS>>(json);
额外代码优化建议
清理冗余代码:你声明了
HttpClient但完全未使用,直接删除这段代码即可。确保资源释放:
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块会自动处理资源释放)改用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,但异步实现更优)异常后状态处理:在
catch块中,可以给ahs赋值空集合(比如ahs = Enumerable.Empty<AHS>();),避免后续代码处理null时抛出异常。
内容的提问来源于stack exchange,提问作者AMN
相关产品推荐
相关产品推荐

