对象引用未设置Json序列化列表中的错误

本文关键字:错误 列表 序列化 设置 Json 对象引用 | 更新日期: 2023-09-27 18:09:57

我有3个c#类,其中我有2个列表,当我试图制作json字符串时,我得到对象引用未设置为对象错误的实例。

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

Model Json -

{
  "accessKey": "7eb228097576abf56968e9845ab51b90",
  "channelId": "103",
  "hotels": [
    {
      "hotelId": "2",
      "rooms": [
        {
          "roomId": "1"
        }
      ]
    }
  ]
}
c# Classes -
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;
    }

对象引用未设置Json序列化列表中的错误

您需要初始化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

initialize rooms字段。我猜它被设置为null。

编辑:

在代码中只初始化了hotels字段。好的做法是初始化构造函数中的字段。

初始化房间列表

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

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

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

像这样:

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

然后在下面的代码中,使用while循环修改它。如果循环执行,它将改变值,否则你将得到一个非空的1值。