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

C# ASP.NET中JSON对象与模型自动映射失败的解决方法

问题描述

在C# ASP.NET项目中,我通过JSON转C#工具生成了对应API响应的Root模型类,使用Newtonsoft.Json反序列化时出现异常:Factivityplan字段返回null,Fkpi和Fproject仅能绑定note_id与sql_id字段,其余字段无法映射。以下是API返回的JSON响应示例及控制器代码,寻求解决该映射问题的方法:

API返回的JSON响应

{"factivityactual": [],"fkpi": [{"note_id": "1DAE3D4A74A7DE91472588D20024C114","sql_id": "test","RefKPI_Detail": "test","Refdocid": "144149A40134720B472588D20024C110","criterion_1": "test","criterion_2": "test","criterion_3": "test","criterion_Type": "2","criterion_4": "test","criterion_5": "test"}],"factivityplan": [{"Q2_sum_Comment": "","sql_id": "","Q1_sum_Comment": "","Activity": "TEST","Q2_sum_Budget": "","Month": "01","Q4_sum_Comment": "","Q3_sum_Comment": "","Order": 0,"M_Budget1": 0,"M_Budget2": 0,"TypeActivity": "test","M_Budget3": 0,"M_Budget4": 0,"M_Budget5": 0,"M_Budget6": 0,"Q4_sum_Budget": "","Unit_T": "test","M_Budget10": 0,"M_Budget11": 0,"OwnerProject": "ทดสอบ~ทดสอบ~ทดสอบ","M_Budget12": 0,"Q3_sum_Budget": "","Detail": "","MainNameActivity": "test","M_Comment10": "test","M_Comment11": "test","M_Comment12": "test","Q1_sum_Budget": "","DetailOwnerName": "ทดสอบ~ทดสอบ~ทดสอบ","RefDocID": "144149A40134720B472588D20024C110","M_Budget7": 0,"M_Budget8": 0,"Budget": 0,"FaceName": "test","M_Budget9": 0,"Budget2": 0,"note_id": "B6783436311E7280472588D20024C115","M_Comment9": "test","sumDetailP": "test","M_Comment7": "test","M_Comment8": "test","M_Comment5": "test","M_Comment6": "test","M_Comment3": "test","M_Comment4": "test","NameActivity": "test","M_Comment1": "test","M_Comment2": "test","criterion_Type": "2"}],"fproject": {"note_id": "144149A40134720B472588D20024C110","CurrentOwner": "ทดสอบ~ทดสอบ~ทดสอบ","sql_id": "test","FormTitle": "test","ProjectName": ".net","StatusText": "test","StatusNo": "100","IDFac": "test","OwnerNamelist": "test","SYear": "test","Reason": "test","Result": "TEST","EPeriod": "","budgetyear": "","Goal": "test","ProjectStatus": "1","ApproveOwner": "ทดสอบ~ทดสอบ~ทดสอบ","budget2": 0,"SPeriod": "","FaceName": "test","Updatedate_dt": "","ProjectDetail": "test","budget": 0,"budgetApprove": 0}}

控制器代码

public static Root LoadDetailDataAPI()
{
    Root ListData = new Root();

    var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://www.mywebsite.com/Develop/Project/Niems/EmitPlan.nsf/project.xsp/getprojectfull");
    httpWebRequest.ContentType = "application/json;  charset=utf-8";
    httpWebRequest.Method = "POST";

    using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
    {
        string json = new JavaScriptSerializer().Serialize(new
        {
            note_id = "144149A40134720B472588D20024C110"
        });

        streamWriter.Write(json);
    }

    var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
    using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
    {
        var result = streamReader.ReadToEnd();
        ListData = Newtonsoft.Json.JsonConvert.DeserializeObject<Root>(result);
    }

    return ListData;
}
解决方案

问题核心是JSON字段与C#模型类字段的命名规则不匹配,Newtonsoft.Json默认区分大小写,而API返回的JSON字段多为小写开头或下划线分隔,C#模型类通常是PascalCase格式,导致映射失败。以下是三种可行的解决方式:

1. 为模型字段添加JsonProperty特性

直接在模型类的每个字段上标注对应的JSON字段名称,精准控制映射关系:

public class Root
{
    [JsonProperty("factivityactual")]
    public List<object> Factivityactual { get; set; }

    [JsonProperty("fkpi")]
    public List<Kpi> Fkpi { get; set; }

    [JsonProperty("factivityplan")]
    public List<ActivityPlan> Factivityplan { get; set; }

    [JsonProperty("fproject")]
    public Project Fproject { get; set; }
}

public class Kpi
{
    [JsonProperty("note_id")]
    public string NoteId { get; set; }

    [JsonProperty("sql_id")]
    public string SqlId { get; set; }

    [JsonProperty("RefKPI_Detail")]
    public string RefKpiDetail { get; set; }

    // 其余字段同理添加JsonProperty特性
}

2. 全局配置忽略大小写

如果所有字段仅存在大小写差异,可通过序列化配置全局忽略大小写,无需逐个修改字段:

var settings = new JsonSerializerSettings
{
    ContractResolver = new DefaultContractResolver
    {
        IgnoreCase = true
    }
};
ListData = Newtonsoft.Json.JsonConvert.DeserializeObject<Root>(result, settings);

3. 重新生成匹配的模型类

使用Visual Studio自带的「编辑 -> 选择性粘贴 -> 将JSON粘贴为类」功能,生成的类会自动包含正确的JsonProperty特性,完全匹配JSON字段,避免手动修改出错。

验证要点
  • 修改后重新调用接口,调试查看ListData各字段是否正确赋值;
  • 若仍有字段为空,检查JSON字段与C#模型的数据类型是否匹配(比如JSON字符串对应C#数值类型),类型不匹配也会导致映射失败。

内容的提问来源于stack exchange,提问作者Ratchanon Volty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:25:32