将SqlDataReader转换为JSON

45
public string toJSON(SqlDataReader o)
{
    StringBuilder s = new StringBuilder();
    s.Append("[");
    if (o.HasRows)
        while (o.Read())
            s.Append("{" + '"' + "Id" + '"' + ":" + o["Id"] + ", "
            + '"' + "CN" + '"' + ":" + o["CatName"] + ", "
            + '"' + "Ord" + '"' + ":" + o["Ord"] + ","
            + '"' + "Icon" + '"' + ":" + o["Icon"] + "}, ");
    s.Remove(s.Length - 2, 2);
    s.Append("]");
    o.Close();
    return s.ToString();
}

我在这里使用自己的函数进行序列化。我需要知道这是否是一个好方法,或者我应该使用其他方法。顺便说一下,我已经尝试过使用JavaScriptSerializer,但它与SqlDataReader不兼容。谢谢。


5
学会使用 string.Format,让你的生活更轻松。 - Oded
1
那么 StringBuilder.AppendFormat 呢?使用逐字字符串文字(以 @ 开头的字符串)呢? - Oded
这可能在某种程度上有所帮助。谢谢。 但是你认为这个函数好不好! - Rawhi
13个回答

1

参考Jonathan的回答,我在ASP.NET Core中有一个类似的需求,需要将SQLDataReader的结果转换为JSON字符串或Result对象,因此我创建了一个扩展方法:

 public static class MyExtensions
    {
        public async static Task<string> toJSON(this SqlDataReader reader)
        {            
            var results = await reader.GetSerialized();
            return JsonConvert.SerializeObject(results, Formatting.Indented);
        }
        public async static Task<IEnumerable<Dictionary<string, object>>> GetSerialized(this SqlDataReader reader)
        {
            var results = new List<Dictionary<string, object>>();
            var cols = new List<string>();
            for (var i = 0; i < reader.FieldCount; i++)
                cols.Add(reader.GetName(i));

            while (await reader.ReadAsync())
                results.Add(SerializeRow(cols, reader));

            return results;
        }
        private static Dictionary<string, object> SerializeRow(IEnumerable<string> cols,
                                                        SqlDataReader reader)
        {
            var result = new Dictionary<string, object>();
            foreach (var col in cols)
                result.Add(col, reader[col]);
            return result;
        }
    }

& 按照我的要求使用它:

var result = await reader.GetSerialized(); //to get the result object

或者

string strResult = await reader.toJSON(); //to get the result string

我创建了一个异步方法,因为在从数据库读取完成之前,我还有其他事情要做。

0
我创建了以下方法,它可以将任何 DataReader 转换为 JSON,但仅适用于单层序列化:
您应该传递读取器和列名称作为字符串数组,例如:
String [] columns = {"CustomerID", "CustomerName", "CustomerDOB"};

然后调用该方法

public static String json_encode(IDataReader reader, String[] columns)
    {
        int length = columns.Length;

        String res = "{";

        while (reader.Read())
        {
            res += "{";

            for (int i = 0; i < length; i++)
            {
                res += "\"" + columns[i] + "\":\"" + reader[columns[i]].ToString() + "\"";

                if (i < length - 1)
                    res += ",";
            }

            res += "}";
        }

        res += "}";

        return res;
    }

1
在C#中,字符串是不可变的,因此基于循环的连接可能需要大量的内存分配。如果您要坚持您所概述的方法,我建议实现一个字符串构建器。话虽如此,我个人不会尝试编写这样的JSON编码器。例如,如果列名或读取器列值的内容包含引号、逗号或括号,那么输出的有效性会发生什么变化? - Bennett Dill

-1
在项目中添加引用:System.Web.Extensions
using System.Web.Script.Serialization;

在C#代码中,你可以使用write:

 var json = new JavaScriptSerializer().Serialize(obj);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接