C#客户端反序列化REST Api错误响应字符串为对象失败问题
问题根因
System.Text.Json 默认反序列化逻辑只会识别并赋值 public 访问级别的属性,你当前定义的ResultError类里所有成员都是私有字段,序列化器完全无法访问这些成员,所以反序列化结果只会保留你给字段设置的初始默认值。
修复步骤
第一步:调整ResultError的成员定义
把类里的私有字段全部改成公共属性,修正后的基础代码如下:
public class ResultError { public IDictionary<string, string[]> Errors { get; set; } = new Dictionary<string, string[]>(); public int Status { get; set; } = 0; public string Title { get; set; } = string.Empty; public string Type { get; set; } = string.Empty; }
第二步:处理JSON键名和C#属性名的大小写匹配问题
接口返回的JSON键是小驼峰格式(errors/status/title/type),和C#常用的大驼峰属性名有大小写差异,选择以下任意一种方案处理即可:
- 方案A:反序列化时开启大小写不敏感匹配,代码改动最小
var serializeOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; ResultError? error = JsonSerializer.Deserialize<ResultError>(errorData, serializeOptions);
- 方案B:给属性显式添加JSON字段映射特性,不需要额外传序列化配置
using System.Text.Json.Serialization; public class ResultError { [JsonPropertyName("errors")] public IDictionary<string, string[]> Errors { get; set; } = new Dictionary<string, string[]>(); [JsonPropertyName("status")] public int Status { get; set; } = 0; [JsonPropertyName("title")] public string Title { get; set; } = string.Empty; [JsonPropertyName("type")] public string Type { get; set; } = string.Empty; }
修改完成后反序列化即可正常拿到所有错误数据:Status会正确赋值为400,Title、Type字段会填充对应返回值,Errors字典也会包含Fail to login对应的错误信息数组。
内容的提问来源于stack exchange,提问作者Rafael Alfredo Zelaya Amaya
相关产品推荐
相关产品推荐

