为数据读取器结果动态创建 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 示例中那样。