我有3个c#类,因为我有2个列表,当我尝试创建一个json字符串时,我没有将Object引用设置为对象Error的实例。
我试过一个列表。它完美有效,但是我的程序中有2个或更多类的列表,它没有用。请帮我解决。
模型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#
public string 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;
}
答案 0 :(得分:3)
您需要初始化Rooms属性。将构造函数添加到Hotel calss中,这样做
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。通常它足以暴露一个吸气剂,并且通常只暴露所需的操作更好。在这种情况下,公开AddRoom
操作而不是公开房间列表
在您的代码中,您循环遍历数据集中的所有记录(并且您正在执行此操作两次)并覆盖hotelId的值。即,您只使用数据集中的最后一条记录,包括hotelId和room
答案 1 :(得分:1)
初始化房间字段。我猜它被设置为null。
编辑:
您正在初始化代码中的酒店字段。 好的做法是在构造函数中初始化字段。
答案 2 :(得分:1)
只需初始化房间列表。
public class Hotel
{
public Hotel()
{
rooms = new List<Room>();
}
public string hotelId { get; set; }
public List<Room> rooms { get; set; }
}
答案 3 :(得分:0)
当r
循环时,while
只会填充Id或其他数据。由于条件,它可能无法执行。这就是r
仍为null
的原因。
当您传递null
值时,会出现此异常。尝试在id
循环之外给它一个简单的while
。
这样的事情:
Room r = new Room();
r.roomId = 1;
然后在下面的代码中,使用while
循环更改它。如果循环执行它将改变值,否则你将有一个非null,1值。