2011-03-03 48 views
0

我有DataReader,它包含来自存储过程caal的结果。结果由两个领域的...手动将结果数据集转换为JSON

UserID 
UserName 

通常我这些结果绑定到ASP.NET下拉列表控制...

ddlUserList.DataSource = rdr // rdr is the DataReader 
ddlUserList.DataTextField = "UserName" 
ddlUserList.DataValueField = "UserID" 
ddlUserList.DataBind() 

不过我现在试图完成使用jQuery同样的事情AJAX。我坚持的是如何手动将保存在DataReader中的数据集转换为JSON。多重值如何分开?这看起来是否正确?

{{"UserID":1, "UserName":"Bob"}, {"UserID":2, "UserName":"Sally"},{"UserID":3, "UserName":"Fred"}} 

我知道有库,在那里,如JSON.NET处理序列化,但我在学习阶段,现在并要确保我明白了一切从下往上。

回答

2

想知道您是否尝试过使用System.Web.Script.Serialization.JavaScriptSerializer库吗?

你可以看一下里克·斯塔尔的博客上这样的: http://www.west-wind.com/weblog/posts/737584.aspx

或者你也可以做类似的创建将DataReader的拉出来的数据,并将其放置在对象的列表的方法。 (请参阅下面的代码)。这些对象列表将使用JavaScriptSerializer库进行序列化。

希望这会有所帮助!

public class User 
{ 
    public int UserId { get; set; } 
    public string UserName { get; set;} 
} 
public class DataLayer 
{ 
    public string GetUsers(string connString) 
    { 
     string result = null; 
     List<User> users = null; 

     // get data using SqlReader 
     using(var conn = new SqlConnection(connString)) 
     { 
      using(var cmd = new SqlCommand{ Connection = conn, CommandText = "SELECT * FROM Users", CommandType = CommandType.Text }) 
      { 
       conn.Open(); 

       var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); 

       if(!reader.HasRows) 
        return null; 

       //convert data reader to a list of user objects 
       users = (List<User>)ConvertToList<User>(ref reader); 

       conn.Close(); 
      } 
     } 

     //convert list of objects in list to json objects 
     var jsonSerializer = new System.Web.Script.Serialization.JavaScriptSerializer(); 
     result = jsonSerializer.Serialize(users); 

     return result; 
    } 

    public static IList<T> ConvertToList<T>(ref SqlDataReader reader) 
    { 
     IList<T> result = null; 

     if (reader.IsClosed) 
      return result; 

     result = new List<T>(); 
     T item = default(T); 
     while (reader.Read()) 
     { 
      //create item instance 
      item = (T)Activator.CreateInstance<T>(); 
      //get class property members 
      var propertyItems = item.GetType().GetProperties(); 
      //populate class property members with data from data reader 
      for (int ctr = 0; ctr < reader.FieldCount; ctr++) 
      { 
       if(reader.GetName(ctr) == propertyItems[ctr].Name) 
        propertyItems[ctr].SetValue(item, UtilsHelper.GetValue<string>(reader[ctr]), null); 
      } 
      //add item to list 
      result.Add(item); 
     } 

     reader.Close(); 
     reader.Dispose(); 

     return result; 
    } 
} 
+5

看起来像很多额外的工作只是为了将数据集转换成两个字段转换成JSON。 – webworm 2011-03-04 16:28:45