ASP.NET Core 3.1中读取并反序列化响应头遇Json序列化异常
问题分析与解决方案
异常原因
你遇到的JsonSerializationException是因为后端响应头X-Pagenation返回的是单个JSON对象(比如包含总条数、当前页、下一页链接的分页元数据),但你却尝试将其反序列化为List<PagedDataModel>(数组类型),JSON对象无法直接转成数组,所以抛出异常。
修正步骤
确认后端返回的
X-Pagenation格式:它应该是单个分页元数据对象,而非数组。比如结构类似:{"TotalCount": 150, "CurrentPage": 1, "NextPageUrl": "/tag?page=2"}修改消费端反序列化逻辑:先将响应头内容反序列化为单个
PagedDataModel实例,再将其包装为IEnumerable<PagedDataModel>(如果你的MultibleValuesHelper.HeaderPagenation必须是集合类型的话)。
修正后的代码
public async Task<MultibleValuesHelper> GetAllTags() { IEnumerable<TagModelDto> tags; IEnumerable<PagedDataModel> Header = null; using (var response = await _httpClient.GetAsync("tag")) { string apiResponse = await response.Content.ReadAsStringAsync(); if (response.Headers.TryGetValues("X-Pagenation", out var Pagenation)) { var headerJson = Pagenation.FirstOrDefault(); if (!string.IsNullOrEmpty(headerJson)) { // 先反序列化为单个分页元数据对象 var pagedData = JsonConvert.DeserializeObject<PagedDataModel>(headerJson); // 包装为IEnumerable类型 Header = new List<PagedDataModel> { pagedData }; } } tags = JsonConvert.DeserializeObject<List<TagModelDto>>(apiResponse); } return new MultibleValuesHelper { TagServiceCollection = tags, HeaderPagenation = Header }; }
额外建议
- 如果
MultibleValuesHelper.HeaderPagenation不需要是集合类型,建议直接将其类型改为PagedDataModel,这样更符合分页元数据的语义,也能避免不必要的集合包装。 - 反序列化前增加空值判断,避免空字符串反序列化导致的额外异常。
内容的提问来源于stack exchange,提问作者Mahmoud Samy
相关产品推荐
相关产品推荐

