对象引用未设置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;
}
您需要初始化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值。