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

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返回结构,只需要调整本地代码即可:

  1. 新增最外层的响应包裹类,对应JSON最外层的response节点
  2. 修正原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 01:24:34