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

时间:2014-06-23 07:48:18

标签: c# nullreferenceexception

我有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;
    }

4 个答案:

答案 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值。