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
相关产品推荐
相关产品推荐

