动态地为数据读取器结果创建JSON对象,而不管它们看起来是什么样子

本文关键字:不管 看起来 什么样 对象 数据 读取 JSON 创建 结果 动态 | 更新日期: 2023-09-27 18:06:17

现在我使用Newtonsoft.jsonOdbcConnection,并为我运行的每个查询手动创建对象。它看起来像这样:

类:

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结果:

2814814
JSON:

result: {
   timestamp: 2016-09-10 8:15,
   data: { '2814814' }
}

或者看起来像这样:

SQL结果:

Apple  | 59    
Orange | 17
JSON:

result: {
   timestamp: 2016-09-10 8:15,
   data: {[ 
      'Apple':'59',
      'Orange':'17'
   ]}
}

或者可以有5列…

有办法做到这一点吗?

动态地为数据读取器结果创建JSON对象,而不管它们看起来是什么样子

可以使用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示例一样,将有效负载的数据字段设置为动态处理单个字段结果。