Blazor Server用HttpClient.GetJsonAsync对接嵌套API报错咨询
核心原因
HttpClient.GetJsonAsync<T>会直接将响应根级JSON反序列化为指定的T类型。当前接口返回的根级JSON是包含message、isError、result的对象,不是Project数组,因此触发类型不匹配的JsonException。
实现步骤
1. 定义通用响应包装类
针对这类统一外层结构的接口,定义泛型包装类可复用在所有同格式的API调用中:
public class ApiResponse<T> { /// <summary>接口返回的提示消息</summary> public string Message { get; set; } /// <summary>接口调用是否出错</summary> public bool IsError { get; set; } /// <summary>接口实际返回的业务数据</summary> public T Result { get; set; } }
Blazor默认使用的System.Text.Json序列化配置大小写不敏感,可自动匹配JSON中小写开头的
message、isError、result字段,无需额外加序列化特性。
2. 修改调用逻辑
先将响应反序列化为带外层包装的ApiResponse<Project[]>类型,再提取内部的项目列表:
// 反序列化完整的包装响应 var apiResponse = await httpClient.GetJsonAsync<ApiResponse<Project[]>>("projects"); // 可选:处理接口返回的业务错误 if (apiResponse.IsError) { throw new InvalidOperationException($"接口调用失败:{apiResponse.Message}"); } // 提取实际的项目列表数据 var projects = apiResponse.Result;
3. 可选适配:Project实体字段匹配
如果你的Project实体属性命名和JSON字段存在非大小写差异(比如下划线、缩写不匹配),需要给对应属性加JsonPropertyName特性显式指定映射:
public class Project { // 示例:如果JSON字段为project_code则需要显式指定,你的当前场景为驼峰命名可省略 // [JsonPropertyName("projectCode")] public string ProjectCode { get; set; } public string BusinessAssociateID { get; set; } public DateTime ContractStartDate { get; set; } public DateTime ContractEndDate { get; set; } public string ContractStatus { get; set; } public string CreatedBy { get; set; } public DateTime CreatedDate { get; set; } public bool Active { get; set; } }
额外注意:如果接口返回的
contractStartDate为MM/dd/yyyy hh:mm:ss tt这类非ISO格式的时间字符串,默认序列化可能出现转换失败,可在Program.cs中全局配置Json序列化的日期转换规则适配该格式。
内容的提问来源于stack exchange,提问作者chunt
相关产品推荐
相关产品推荐

