C#从Country Master表取两列转JSON时遇空引用异常求助
解决C#序列化JSON时的“Object reference not set to an instance of an object”错误
嘿,我来帮你搞定这个头疼的空引用问题!从你描述的场景和给出的代码片段来看,这个错误大概率是因为序列化过程中用到了未初始化的对象,或者数据库查询结果里的空值没处理到位。咱们一步步来排查解决:
可能的原因&解决方案
1. 数据库查询结果为空,直接拿来序列化
如果你从Country Master查询数据后,没判断结果是否为null就直接序列化,肯定会炸。比如你用EF或者LINQ查询的话,先做个非空判断:
// 替换成你的实际查询逻辑 var countryQuery = db.CountryMaster.Select(c => new { c.CountryId, c.CountryName }); // 确保查询结果不为null,为空的话初始化一个空集合 var countryData = countryQuery?.ToList() ?? new List<object>();
2. 要序列化的集合/对象没初始化
很多时候新手容易犯的错:声明了集合但没new出来,直接赋值为null后去序列化。比如:
// 错误示例:只声明不初始化 List<CountryDto> countryList; // 正确姿势:先初始化空集合 List<CountryDto> countryList = new List<CountryDto>();
如果是自定义的DTO类,记得实例化每个对象再添加到集合里,别直接用数据库返回的null对象:
foreach(var dbItem in db.CountryMaster) { // 每个DTO都要new出来,避免引用数据库里的空对象 countryList.Add(new CountryDto { CountryId = dbItem.CountryId, CountryName = dbItem.CountryName }); }
3. DataContractJsonSerializer不处理null对象
你代码里引用了DataContractJsonSerializer,这个序列化器如果接收到null对象,直接调用WriteObject就会抛空引用。所以序列化前一定要判断:
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<CountryDto>)); using(MemoryStream ms = new MemoryStream()) { // 先判断要序列化的对象不为null if(countryList != null) { serializer.WriteObject(ms, countryList); } else { // 序列化一个空集合代替null,避免报错 serializer.WriteObject(ms, new List<CountryDto>()); } string json = Encoding.UTF8.GetString(ms.ToArray()); }
4. 数据库列存在空值,映射时没处理
如果Country Master里的列(比如CountryName)允许为空,那映射到DTO的时候要确保属性能接收null值。比如用string类型(本身支持null),如果是值类型(比如int),可以用可空类型int?:
[DataContract] public class CountryDto { [DataMember] public int CountryId { get; set; } // 如果CountryId不允许空,用int [DataMember] public string CountryName { get; set; } // string天然支持null [DataMember] public int? Population { get; set; } // 如果数据库列允许空,用可空类型 }
完整示例代码
把上面的要点整合起来,给你一个可直接参考的完整代码:
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization.Json; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace MDC_web.JSONs { public partial class jsonCountry : System.Web.UI.Page { // 定义DTO,加上DataContract和DataMember特性(DataContractJsonSerializer需要) [DataContract] public class CountryDto { [DataMember] public int CountryId { get; set; } [DataMember] public string CountryName { get; set; } } protected void Page_Load(object sender, EventArgs e) { // 先初始化空集合,避免null List<CountryDto> countryList = new List<CountryDto>(); // 替换成你的实际数据库上下文 using(var db = new YourDatabaseContext()) { // 查询并映射到DTO var queryResult = db.CountryMaster .Select(c => new CountryDto { CountryId = c.CountryId, CountryName = c.CountryName }) .ToList(); // 处理查询结果为空的情况 if(queryResult != null && queryResult.Any()) { countryList = queryResult; } } // 序列化JSON string jsonOutput; DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<CountryDto>)); using(MemoryStream ms = new MemoryStream()) { serializer.WriteObject(ms, countryList); jsonOutput = Encoding.UTF8.GetString(ms.ToArray()); } // 输出JSON响应 Response.ContentType = "application/json"; Response.Write(jsonOutput); Response.End(); } } }
总的来说,这个空引用错误的核心就是某个你要使用的对象没有被实例化,可能是查询结果为null,也可能是集合没初始化,或者序列化时传入了null对象。按照上面的步骤逐一排查,应该就能顺利解决啦!
内容的提问来源于stack exchange,提问作者Aniruddha Nath
相关产品推荐
相关产品推荐

