Преобразование результирующего набора данных в JSON вручную - PullRequest
0 голосов
/ 04 марта 2011

У меня есть 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 Ответ

2 голосов
/ 04 марта 2011

Интересно, пытались ли вы использовать System.Web.Script.Serialization.JavaScriptSerializer library?

Вы можете посмотреть блог Рика Штала по этому поводу: 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...