将 SQLDataReader 结果转换为 JSON,嵌套 JSON 个对象
Convert SQLDataReader results to JSON, with nested JSON objects
我有一个 C# 应用程序,它以下列格式检索 SQL 结果集:
customer_id date_registered date_last_purchase loyalty_points
1 2017-01-01 2017-05-02 51
2 2017-01-23 2017-06-21 124
...
如何将其转换为 JSON 字符串,以便第一列 (customer_id) 是一个键,所有其他后续列都是嵌套-[=27= 中的值] 每个客户 ID 的对象?
示例:
{
1: {
date_registered: '2017-01-01',
date_last_purchase: '2017-05-02',
loyalty_points: 51,
...
},
2: {
date_registered: '2017-01-23',
date_last_purchase: '2017-06-21',
loyalty_points: 124,
...
},
...
}
除了date_registered
、date_last_purchase
、loyalty_points
之外,以后可能还会有其他的栏目,这里就不特指这些栏目名称了。因此,我已经使用下面的代码来获取列名,但在此之后卡住了。
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
var columns = new List<string>();
for (var i = 0; i < sqlDataReader.FieldCount; i++)
{
columns.Add(sqlDataReader.GetName(i));
}
while (sqlDataReader.Read())
{
rows.Add(columns.ToDictionary(column => column, column => sqlDataReader[column]));
}
您可以使用类似的方法将数据 reader 转换为 Dictionary<object, Dictionary<string, object>>
,然后使用 Json.NET 将其转换为 JSON:
var items = new Dictionary<object, Dictionary<string, object>>();
while (sqlDataReader.Read())
{
var item = new Dictionary<string, object>(sqlDataReader.FieldCount - 1);
for (var i = 1; i < sqlDataReader.FieldCount; i++)
{
item[sqlDataReader.GetName(i)] = sqlDataReader.GetValue(i);
}
items[sqlDataReader.GetValue(0)] = item;
}
var json = Newtonsoft.Json.JsonConvert.SerializeObject(items, Newtonsoft.Json.Formatting.Indented);
更新: JSON "names" 总是字符串,所以使用 object
和 GetValue
作为键。
我有一个 C# 应用程序,它以下列格式检索 SQL 结果集:
customer_id date_registered date_last_purchase loyalty_points
1 2017-01-01 2017-05-02 51
2 2017-01-23 2017-06-21 124
...
如何将其转换为 JSON 字符串,以便第一列 (customer_id) 是一个键,所有其他后续列都是嵌套-[=27= 中的值] 每个客户 ID 的对象?
示例:
{
1: {
date_registered: '2017-01-01',
date_last_purchase: '2017-05-02',
loyalty_points: 51,
...
},
2: {
date_registered: '2017-01-23',
date_last_purchase: '2017-06-21',
loyalty_points: 124,
...
},
...
}
除了date_registered
、date_last_purchase
、loyalty_points
之外,以后可能还会有其他的栏目,这里就不特指这些栏目名称了。因此,我已经使用下面的代码来获取列名,但在此之后卡住了。
SqlDataReader sqlDataReader = sqlCommand.ExecuteReader();
var columns = new List<string>();
for (var i = 0; i < sqlDataReader.FieldCount; i++)
{
columns.Add(sqlDataReader.GetName(i));
}
while (sqlDataReader.Read())
{
rows.Add(columns.ToDictionary(column => column, column => sqlDataReader[column]));
}
您可以使用类似的方法将数据 reader 转换为 Dictionary<object, Dictionary<string, object>>
,然后使用 Json.NET 将其转换为 JSON:
var items = new Dictionary<object, Dictionary<string, object>>();
while (sqlDataReader.Read())
{
var item = new Dictionary<string, object>(sqlDataReader.FieldCount - 1);
for (var i = 1; i < sqlDataReader.FieldCount; i++)
{
item[sqlDataReader.GetName(i)] = sqlDataReader.GetValue(i);
}
items[sqlDataReader.GetValue(0)] = item;
}
var json = Newtonsoft.Json.JsonConvert.SerializeObject(items, Newtonsoft.Json.Formatting.Indented);
更新: JSON "names" 总是字符串,所以使用 object
和 GetValue
作为键。