【问题标题】:Object reference not set Error in Json Serialize in Lists对象引用未设置列表中的 Json 序列化错误
【发布时间】:2014-06-23 07:48:18
【问题描述】:

我有 3 个 c# 类,其中有 2 个列表,当我尝试创建一个 json 字符串时,我得到 Object reference not set to an instance of an object 错误。

我尝试过使用一个列表。它完美地工作,但我的程序中有 2 个或更多类的列表,它不起作用。请帮我解决。

模型 Json -

{
  "accessKey": "7eb228097576abf56968e9845ab51b90",
  "channelId": "103",
  "hotels": [
    {
      "hotelId": "2",
      "rooms": [
        {
          "roomId": "1"
        }
      ]
    }
  ]
}

C# 类 -

public class RootObject
{
    public string accessKey { get; set; }
    public string channelId { get; set; }
    public List<Hotel> hotels { get; set; }            
}
public class Hotel
{
    public string hotelId { get; set; }
    public List<Room> rooms { get; set; }           
}
public class Room
{
    public string roomId { get; set; }           
}

C#

公共字符串 cc() {

    string s = "";
    RootObject ro = new RootObject();
    ro.accessKey = "7eb228097576abf56968e9845ab51b90";
    ro.channelId = "103";
    ro.hotels = new List<Hotel>();

    Hotel h = new Hotel();
    Room r = new Room();

    string config = "server=localhost;username=someuser;password=somepwd;database=db";

    MySqlConnection connection = new MySqlConnection(config);

    string query = "select * from test1";

    MySqlCommand command = new MySqlCommand(query, connection);
    connection.Open();
    MySqlDataReader Reader = command.ExecuteReader();
    while (Reader.Read())
    {
         r.roomId = Reader[2].ToString();
    }
    connection.Close();

    query = "select * from test1";

    command = new MySqlCommand(query, connection);
    connection.Open();
    Reader = command.ExecuteReader();
    while (Reader.Read())
    {
        h.hotelId = Reader[1].ToString();
    }
    connection.Close();

    h.rooms.Add(r);       // Object reference not set to an instance of an object Error

    ro.hotels.Add(h);


    JavaScriptSerializer js = new JavaScriptSerializer();
    s = js.Serialize(ro);

    return s;
    }

【问题讨论】:

  • 你在哪一行得到错误?
  • h.rooms.Add(r);我在节目中提到过先生
  • 另外,提供minimal, complete and verifiable example。 sql连接与问题完全无关。
  • 好吧,你做到了,但你也提供了太多不相关的信息,以至于它没有显示在屏幕上
  • 实际上,在序列化对象之前,您会遇到异常。所以这和json序列化完全没有关系,标题也没有意义。

标签: c# nullreferenceexception


【解决方案1】:

您需要初始化 Rooms 属性。向执行此操作的 Hotel 类添加构造函数

public class Hotel
{
    public Hotel(string hotelId){
         this.hotelId = hotelId;
         this.rooms = New List<Room>();
    }

    public string hotelId { get; private set; }
    public List<Room> rooms { get; private set; }           
}

然后你会实例化一个像这样的房间new Hotel(hotelId)

通常最好将不应更改的内容封装起来。通常不应从对象外部更改键。例如。更改 hotelId 并保留房间列表是否有意义?

建议完全不要为集合公开 setter。通常暴露一个 getter 就足够了,通常最好只暴露所需的操作,例如在这种情况下,公开AddRoom 操作而不是公开房间列表

在您的代码中,您正在循环访问数据集中的所有记录(并且您这样做了两次)并覆盖了 hotelId 的值。即,您仅将数据集中的最后一条记录用于 hotelId 和 room

【讨论】:

  • 谢谢您,先生。它有帮助。
【解决方案2】:

初始化房间字段。我猜它被设置为null。

编辑:

您仅在代码中初始化酒店字段。 好的做法是在构造函数中初始化字段。

【讨论】:

    【解决方案3】:

    只需初始化房间列表。

    public class Hotel
    {
        public Hotel()
        {
            rooms = new List<Room>();
        }
    
        public string hotelId { get; set; }
    
        public List<Room> rooms { get; set; }           
    }
    

    【讨论】:

      【解决方案4】:

      r 只有在存在 while 循环时才会被 ID 或其他数据填充。由于条件,它可能不会被执行。这就是为什么r 仍然是null

      当您传递null 值时,会出现此异常。尝试在while 循环之外给它一个简单的id

      类似这样的:

      Room r = new Room();
      r.roomId = 1;
      

      然后在下面的代码中,使用while 循环对其进行更改。如果循环执行,它会改变值,否则你将有一个非空的 1 值。

      【讨论】:

      • 将 null 传递给列表的 Add 是完全有效的
      • 并不是你仍然假设 r 是罪魁祸首,但在有问题的行中,r 不可能导致 nullref 异常。但是现场房间未初始化,因此为空
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多