手动将结果数据集转换为JSON

时间:2011-03-03 23:53:14

标签: asp.net json

我有DataReader来保存存储过程caal的结果。结果包括两个领域......

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来处理序列化,但我现在处于学习阶段,并希望确保我从头到底了解所有内容。

1 个答案:

答案 0 :(得分:2)

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

你可以看看Rick Stahl的博客: 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;
    }
}