2017-08-23 87 views
-2

我有检索以下格式设置SQL结果的C#应用​​程序:转换SqlDataReader的结果,以JSON,嵌套JSON对象

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)是一个关键字,并且所有其他后续列都是每个客户ID的嵌套JSON对象中的值?

例子:

{ 
     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_registereddate_last_purchaseloyalty_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])); 
} 
+0

'我怎样才能将其转换为JSON字符串'我没有看到你的问题,以实现这一点的任何尝试。 –

回答

1

你可以使用类似这样的数据读取器转换为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“名称”总是字符串,因此使用objectGetValue作为密钥。

+0

这很好,谢谢! – user2181948