2016-09-08 13 views
1

Прямо сейчас я использую Newtonsoft.json с моим OdbcConnection и вручную создаю объекты для каждого выполняемого запроса. Это выглядит примерно так:Динамически создавать объекты JSON для результатов datareader, независимо от того, как они выглядят?

Классы:

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 колонок ...

Есть ли способ сделать это?

+0

Вы можете создать функцию, которая создает Json-строку из вашего набора результатов, если она такая же простая, как и те, что указаны выше. Json - это просто форматированная строка. – ekenman

ответ

2

Вы можете использовать динамический тип 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.

+0

Это замечательно! Следующий вопрос здесь: http://stackoverflow.com/questions/39395050/error-with-datareader-when-value-from-timestamp-column-is-null Но это может быть спецификация [tag: intersystems-cache]. –