【问题标题】:Manually converting result dataset to JSON手动将结果数据集转换为 JSON
【发布时间】:2011-03-04 08:31:54
【问题描述】:

我有保存存储过程结果的 DataReader。结果包含两个字段...

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 之类的库来处理序列化,但我现在正处于学习阶段,想确保我从下往上理解所有内容。

【问题讨论】:

    标签: asp.net json


    【解决方案1】:

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

    您可以在此查看 Rick Stahl 的博客: http://www.west-wind.com/weblog/posts/737584.aspx

    或者您也可以创建一个方法,从数据读取器中提取数据并将其放入对象列表中。 (见下面的代码)。这些对象列表将使用 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;
        }
    }
    

    【讨论】:

    • 似乎需要做很多额外的工作才能将具有两个字段的数据集转换为 JSON。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多