.NET 6中JsonSerializer.Deserialize返回含空对象数组的问题
问题分析与修复方案
核心问题1:类属性访问权限不足
你的MemberRoster类中,HealthId属性是默认私有访问权限,而System.Text.Json序列化器只能访问**公共(public)**属性,导致无法将JSON中的值赋值给该属性,最终得到空对象数组。
核心问题2:HTTP请求调用方式错误
代码里await httpClient.GetAsync(memberUri).Result存在严重问题:.Result会阻塞线程,叠加await极易引发死锁,正确做法是直接await异步方法。
核心问题3:JSON结构与目标类型不匹配(根据截图推断)
从JSON截图来看,返回的JSON根对象并非直接的成员数组,而是包含members数组的对象(格式类似{"members": [{"health_id": "...", ...}]})。直接反序列化成IEnumerable<MemberRoster>会因结构不匹配导致解析失败。
修复后的完整代码
1. 定义匹配JSON结构的根对象类
public class MemberResponse { [JsonPropertyName("members")] public IEnumerable<MemberRoster> Members { get; set; } } public class MemberRoster { [JsonPropertyName("health_id")] public string HealthId { get; set; } // 修改为public访问权限 }
2. 修复HTTP请求与反序列化逻辑
public async Task<IEnumerable<MemberRoster>> GetAsync(string groupNumber) { var httpClient = _httpClientFactory.CreateClient(); httpClient.DefaultRequestHeaders.Accept.Clear(); httpClient.DefaultRequestHeaders.Add("client_id", Configuration["Microservices:RequestHeaders:client_id"]); httpClient.DefaultRequestHeaders.Add("client_secret", Configuration["Microservices:RequestHeaders:client_secret"]); var queryParams = new Dictionary<string, string>() { ["groupNumber"] = groupNumber }; var memberUri = QueryHelpers.AddQueryString(Configuration["Microservices:Member"], queryParams); var response = await httpClient.GetAsync(memberUri); // 移除.Result,直接await response.EnsureSuccessStatusCode(); // 建议添加,确保请求成功 var responseContent = await response.Content.ReadAsStringAsync(); // 先反序列化成根对象,再取出成员数组 var memberResponse = JsonSerializer.Deserialize<MemberResponse>(responseContent); return memberResponse?.Members ?? Enumerable.Empty<MemberRoster>(); }
额外验证建议
- 可以将
responseContent输出到日志或控制台,确认JSON字符串的实际结构,确保根对象类的定义完全匹配。 - 如果JSON中还有其他需要解析的字段,只需在
MemberRoster类中添加对应的公共属性并标记[JsonPropertyName]特性即可。
内容的提问来源于stack exchange,提问作者Austin Born
相关产品推荐
相关产品推荐

