Dictionary<string,object>包含多数据类型对象的结构可行性及空引用异常问题求助
Dictionary<string,object>包含多数据类型对象的结构可行性及空引用异常问题求助
嘿,我来帮你梳理下这个问题的核心原因和解决方案!
首先,你遇到的空引用异常是因为JSON结构和代码里的类型转换不匹配导致的:
你的请求JSON里,configData是一个对象数组(格式是[{...}, {...}, {...}]),但你在控制器里尝试把它直接转成Dictionary<string,string>——这显然不对,数组没法直接转成单个字典,所以apiConfigData会变成null,当你去访问apiConfigData["filename"]的时候自然就抛出了“对象引用未设置到对象实例”的错误。
然后回答你的疑问:这种包含多数据类型对象的结构是完全可行的,只是你需要用正确的C#类型去匹配JSON的结构。
给你两种解决方案,按需选择:
方案一:使用强类型模型(推荐)
这种方式更清晰,也能避免类型转换的错误,还能获得IDE的智能提示。你可以先定义对应JSON结构的模型类:
// 对应configData里的单个对象 public class ConfigItem { public string filename { get; set; } public string year { get; set; } public string month { get; set; } } // 对应unitData里的单个对象 public class UnitItem { public int a { get; set; } public int b { get; set; } public string c { get; set; } } // 整个请求的根模型 public class AuditRequest { public List<ConfigItem> configData { get; set; } public List<UnitItem> unitData { get; set; } }
然后修改控制器方法,直接接收这个强类型模型:
public string createAuditRels([FromBody] AuditRequest apiData) { // 从configData列表里获取filename(注意处理可能找不到的情况) var filename = apiData.configData?.FirstOrDefault(item => !string.IsNullOrEmpty(item.filename))?.filename; // 后续可以直接使用apiData.unitData里的各项数据 // ... 你的业务逻辑 }
方案二:继续使用Dictionary<string, object>(适合临时场景)
如果你不想定义模型类,那需要正确识别configData的数组类型,把它转成字典的列表:
public string createAuditRels([FromBody] Dictionary<string,object> apiData) { // 把configData转成List<Dictionary<string, string>>,而非单个Dictionary var apiConfigData = apiData["configData"] as List<Dictionary<string,string>>; // 找到包含filename键的字典项 var filenameDict = apiConfigData?.FirstOrDefault(dict => dict.ContainsKey("filename")); // 安全获取filename值 var filename = filenameDict?["filename"]; // unitData同理,需转成List<Dictionary<string, object>>或对应强类型列表 var unitData = apiData["unitData"] as List<Dictionary<string, object>>; // ... 你的业务逻辑 }
最后提醒下:使用强类型模型不仅能避免这类类型转换错误,还能让代码更易维护,后续修改JSON结构时也能快速调整对应模型,所以更推荐第一种方案哦!
备注:内容来源于stack exchange,提问作者João Gomes
相关产品推荐
相关产品推荐

