You need to enable JavaScript to run this app. Blazor Server用HttpClient.GetJsonAsync对接嵌套API报错咨询
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.13 12:06:03