2011-03-03 45 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