ASP.NET MVC JsonConvert反序列化tCustLst返回null问题咨询
问题原因
两个直接问题导致tCustLst属性反序列化为null:
- 层级不匹配:你接收到的JSON最外层包裹了一层
response节点,所有业务字段(cErrorMessage、moreRecordsAvailable、tCustLst)都在response对象内部,但你当前的Rootobject直接对应业务字段层级,没有匹配最外层的response键,反序列化时根本读不到内部的业务属性。这也是功能此前正常、近期突然失效的核心原因——API近期更新加了这层外层包裹,本地模型没有同步调整。 - 属性名拼写错误:就算忽略外层节点问题,你在
Rootobject里定义的属性名是tCustList(完整拼写List),但JSON里对应的键名是tCustLst(缩写Lst,少了字母i),名称不匹配时Newtonsoft.Json不会自动赋值,自然返回null。
*额外注意:你定义的custNo、ordBal、totalBal用了float类型,存在数值精度丢失风险,建议换成decimal类型,这个问题不会导致null,但会造成后续数值计算偏差。
修复方案
不需要修改API返回结构,只需要调整本地代码即可:
- 新增最外层的响应包裹类,对应JSON最外层的
response节点 - 修正原Rootobject中tCustLst属性的拼写,和JSON键名保持一致(也可以加
[JsonProperty("tCustLst")]特性标注,两种方式等效)
修复后的完整模型代码:
using Newtonsoft.Json; using System.Collections.Generic; namespace WebappsIntranet.Models { public class CustomerList { // 新增最外层类,对应JSON最外层的response节点 public class ApiResponseRoot { [JsonProperty("response")] public Rootobject Response { get; set; } } public class Rootobject { public string cErrorMessage { get; set; } public bool moreRecordsAvailable { get; set; } // 修正属性名拼写,和JSON键名tCustLst保持一致 public tCustLst tCustLst { get; set; } } public class tCustLst { [JsonProperty("t-custLst")] public List<tCustcomerList> tcustomerlist { get; set; } } public class tCustcomerList { // 替换float为decimal避免精度丢失 public decimal custNo { get; set; } public string shipTo { get; set; } public string name { get; set; } public string addr1 { get; set; } public string addr2 { get; set; } public string city { get; set; } public string state { get; set; } public string zipCd { get; set; } public decimal ordBal { get; set; } public decimal totalBal { get; set; } public string sortFld { get; set; } } } }
控制器中的反序列化代码对应调整为匹配新的根类:
// 反序列化时用新增的ApiResponseRoot作为根类型 CustomerList.ApiResponseRoot apiResult = JsonConvert.DeserializeObject<CustomerList.ApiResponseRoot>(result); CustomerList.Rootobject records = apiResult.Response; return View(records);
调整后即可正常读取tCustLst下的列表数据。
内容的提问来源于stack exchange,提问作者mattisjd
相关产品推荐
相关产品推荐

