动态地为数据读取器结果创建JSON对象,而不管它们看起来是什么样子
本文关键字:不管 看起来 什么样 对象 数据 读取 JSON 创建 结果 动态 | 更新日期: 2023-09-27 18:06:17
现在我使用Newtonsoft.json
和OdbcConnection
,并为我运行的每个查询手动创建对象。它看起来像这样:
类:
public class payload
{
public string id;
public string type;
public DateTime timestmap;
public object data;
}
public class resultPhrLastTime
{
public string facilityId;
public string type;
public string time;
}
代码:
payload result = new payload();
var resultList = new List<resultPhrLastTime>();
result.id = "someid";
//connection stuff
while (reader.Read())
{
var t = new resultPhrLastTime();
//if (verbose) log(reader[0].ToString());
t.facilityId = reader[0].ToString();
t.type = reader[1].ToString();
t.time = reader[2].ToString();
resultList.Add(t);
}
result.data = resultList;
result.timestmap = DateTime.Now;
result.type = "complex";
string output = JsonConvert.SerializeObject(result);
这工作得很好,但每次我添加一个新的查询到我的应用程序(其中将有很多),我必须创建一个新的自定义类,如果数据看起来不一样。
我想找到一种方法来转换整个reader
对象JSON无论格式,所以它可能看起来像这样:
SQL结果:JSON:2814814
result: { timestamp: 2016-09-10 8:15, data: { '2814814' } }
或者看起来像这样:
SQL结果:JSON:Apple | 59 Orange | 17
result: { timestamp: 2016-09-10 8:15, data: {[ 'Apple':'59', 'Orange':'17' ]} }
或者可以有5列…
有办法做到这一点吗?
可以使用c#的动态类型
public class payload
{
public string id;
public string type;
public DateTime timestmap;
public dynamic data;
}
payload result = new payload();
var resultList = new List<Dictionary<string, dynamic>>();
result.id = "someid";
//connection stuff
while (reader.Read())
{
var t = new Dictionary<string, dynamic>();
for (var i = 0; i<reader.FieldCount; i++)
{
t[reader.GetName(i)] = reader[i];
}
resultList.Add(t);
}
result.data = resultList;
result.timestmap = DateTime.Now;
result.type = "complex";
string output = JsonConvert.SerializeObject(result);
动态类型由JsonConvert自动处理。
您还可以像第一个JSON示例一样,将有效负载的数据字段设置为动态处理单个字段结果。