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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:08:28