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
相关产品推荐
相关产品推荐

