.NET Core 5调用API返回数据正常但PPodcast模型反序列化赋值为null如何解决
问题原因及修复方案
常见触发原因
- 未校验HTTP响应状态:如果接口返回4xx/5xx错误,读取到的内容是错误提示/HTML页面,而非目标JSON,直接反序列化会得到null
- 请求URL拼接错误:
$"{_storageOption.devVirtualPath}{_endpoints.ObtenerPodcast}" + id的写法如果_endpoints.ObtenerPodcast末尾没有斜杠,会生成类似api/ObtenerPodcast123的错误路径,触发接口404 - JSON结构不匹配:部分接口会将业务数据包裹在
data/result等外层字段中,实际返回结构为{"code":200,"data":{PPodcast内容}},直接反序列化整个响应自然无法匹配PPodcast模型 - 反序列化规则不匹配:
- 属性大小写不一致:返回JSON为大驼峰命名(如
Id/Titulo),模型为小驼峰命名,默认配置下无法匹配 - 日期格式不兼容:模型中
Fecha为非空DateTime类型,如果接口返回的日期格式不符合Newtonsoft.Json默认解析规则,或该字段返回空值,会触发反序列化失败 - 多余字段导致解析异常:返回JSON存在模型未定义的字段时,默认配置可能触发解析中断
- 属性大小写不一致:返回JSON为大驼峰命名(如
修复步骤
- 先校验HTTP响应状态,修正请求逻辑和反序列化配置
public async Task<IActionResult> details(int id) { if (id != 0) { PPodcast podcast = null; using (var httpClient = new HttpClient()) { // 修正URL拼接规则,补全斜杠避免路径错误 var requestUrl = $"{_storageOption.devVirtualPath}{_endpoints.ObtenerPodcast}/{id}"; using (var response = await httpClient.GetAsync(requestUrl)) { // 只在响应成功时读取解析内容 if (response.IsSuccessStatusCode) { string apiResponse = await response.Content.ReadAsStringAsync(); // 此处可打日志/断点查看apiResponse的实际内容,确认JSON结构 // 配置反序列化规则 podcast = JsonConvert.DeserializeObject<PPodcast>(apiResponse, new JsonSerializerSettings { PropertyNameCaseInsensitive = true, // 忽略属性大小写差异 DateFormatString = "yyyy-MM-dd HH:mm:ss", // 替换为你接口实际返回的日期格式 MissingMemberHandling = MissingMemberHandling.Ignore, // 忽略模型不存在的字段 NullValueHandling = NullValueHandling.Ignore // 忽略空值字段 }); } } } ViewBag.idPodcast = id; return View(podcast); } return View(null); }
- 如果确认JSON存在外层包裹,先定义通用响应类再解析:
// 定义通用接口响应类 public class ApiResponse<T> { public T data { get; set; } // 可根据实际接口补充code、msg等字段 } // 反序列化逻辑修改为 var apiResult = JsonConvert.DeserializeObject<ApiResponse<PPodcast>>(apiResponse, new JsonSerializerSettings { // 同上配置 }); podcast = apiResult?.data;
- 可选优化:如果接口可能返回空的
Fecha字段,可将模型中该字段修改为可空类型避免解析失败:
public DateTime? Fecha { get; set; }
内容的提问来源于stack exchange,提问作者Daniel Lazarte
相关产品推荐
相关产品推荐

