为数据读取器结果动态创建 JSON 对象,不管它们看起来像什么?
Dynamically create JSON object for datareader results, regardless of what they look like?
现在我在 OdbcConnection
中使用 Newtonsoft.json
并为我 运行 的每个查询手动创建对象。它看起来像这样:
类:
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);
这工作正常,但每次我向我的应用程序添加新查询(其中会有很多)我必须创建一个新的自定义 class 如果数据看起来完全不同。
我想找到一种方法将整个 reader
对象转换为 JSON 而不管格式如何,所以它可能看起来像这样:
SQL Result:
2814814
JSON:
result: {
timestamp: 2016-09-10 8:15,
data: { '2814814' }
}
或者它可能看起来像这样:
SQL Result:
Apple | 59
Orange | 17
JSON:
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 示例中那样。
现在我在 OdbcConnection
中使用 Newtonsoft.json
并为我 运行 的每个查询手动创建对象。它看起来像这样:
类:
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);
这工作正常,但每次我向我的应用程序添加新查询(其中会有很多)我必须创建一个新的自定义 class 如果数据看起来完全不同。
我想找到一种方法将整个 reader
对象转换为 JSON 而不管格式如何,所以它可能看起来像这样:
SQL Result:
2814814
JSON:
result: { timestamp: 2016-09-10 8:15, data: { '2814814' } }
或者它可能看起来像这样:
SQL Result:
Apple | 59 Orange | 17
JSON:
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 示例中那样。