You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中JSON反序列化ApiResponse<DBResponse<int>>失败的原因排查

反序列化失败原因及解决方案

问题背景

你实现了泛型类ApiResponse<T>和DBResponse<T>用于API请求的类型化返回处理,当返回类型为ApiResponse<DBResponse<List<Dictionary<string, object>>>>时反序列化正常,但使用ApiResponse<DBResponse<int>>时触发JsonException,错误信息显示无法将JSON值转换为DBResponse<int>。

失败原因

核心问题在于DBResponse<T>类没有无参构造函数,而System.Text.Json默认会优先使用类的构造函数进行反序列化:

  • 当T是引用类型(如List<...>)时,反序列化器能正确匹配带参构造函数的参数,完成实例化;
  • 当T是值类型(如int)时,值类型的可空处理逻辑与引用类型存在差异,反序列化器在尝试将JSON中的数值1映射到构造函数的T? data参数时,出现匹配错误,最终导致反序列化失败。

解决方案

方案1:添加无参构造函数(推荐)

给DBResponse<T>添加无参构造函数,并初始化非可空的Message属性(适配可空引用类型规则):

public class DBResponse<T>
{
    public int Code { get; set; }
    public string Message { get; set; }
    public bool Success { get; set; }
    public T? Data { get; set; }

    // 添加无参构造函数
    public DBResponse()
    {
        Message = string.Empty;
    }

    public DBResponse(int code, string message, bool success, T? data = default)
    {
        Code = code;
        Message = message;
        Success = success;
        Data = data;
    }
}

添加后,System.Text.Json会通过无参构造函数创建实例,再逐个赋值属性,无论T是值类型还是引用类型都能正确解析。

方案2:配置反序列化选项

修改JsonSerializerOptions,指定优先使用属性初始化而非构造函数:

var apiResponse = JsonSerializer.Deserialize<ApiResponse<T>>(rawResponseJson, new JsonSerializerOptions
{
    PropertyNameCaseInsensitive = true,
    ConstructorHandling = ConstructorHandling.Default
});

该方案无需修改DBResponse<T>类,但需要确保所有非可空属性在反序列化时能被正确赋值。


内容的提问来源于stack exchange,提问作者Avraham Cohen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 05:24:56