2015-10-25 2 views
1

Я хочу сериализовать несколько DataTables для JSON, которые взаимосвязаны, и возможно, что в таблице сопоставления будет добавлена ​​дополнительная таблица. В этом случае у меня есть 3 DataTables.Рекурсивно сериализуйте несколько иерархий Datatable для объекта JSON

  • Таблица А как родитель
  • Таблица B как ребенок Таблица A
  • таблице С, как ребенка Таблица B

Выход JSON должен быть

{ 
    "TableA": [ 
     { 
      "ID": "2490", 
      "TYPE": "Electronic", 
      "TableB": [ 
       { 
        "ID": "2490", 
        "ITEM": "XMT123", 
        "RECEIPT_NUM": "59", 
        "TableC": [ 
         { 
          "ID": "2490", 
          "ITEM": "XMT123", 
          "QUANTITY": "164" 
         } 
        ] 
       }, 
       { 
        "ID": "2491", 
        "ITEM": "XMT234", 
        "RECEIPT_NUM": "12", 
        "TableC": [ 
         { 
          "ID": "2491", 
          "ITEM": "XMT234", 
          "QUANTITY": "92" 
         } 
        ] 
       } 
      ] 
     }, 
     { 
      "ID": "2491", 
      "TYPE": "Electronic", 
      "TableB": [ 
       { 
        "ID": "2491", 
        "ITEM": "XMT456", 
        "RECEIPT_NUM": "83", 
        "TableC": [ 
         { 
          "ID": "2491", 
          "ITEM": "XMT456", 
          "QUANTITY": "261" 
         } 
        ] 
       }, 
       { 
        "ID": "2492", 
        "ITEM": "XMT567", 
        "RECEIPT_NUM": "77", 
        "TableC": [ 
         { 
          "ID": "2492", 
          "ITEM": "XMT567", 
          "QUANTITY": "70" 
         } 
        ] 
       } 
      ] 
     } 
    ] 
} 

Я уже пробовал код вроде этого, но он не работает

static void dataToJson(string connection_string, string query, string table_name) 
{ 
    try 
    { 
     JArray jArray = new JArray(); 
     DataTable tbl = new DataTable(); 
     DataTable inner_tbl = new DataTable(); 
     SqlConnection conn = new SqlConnection(connection_string); 
     conn.Open(); 
     var adapter = new SqlDataAdapter(query, conn); // query to get parent 
     adapter.Fill(tbl); 
     foreach (DataRow row in tbl.Rows) 
     { 
      JObject jo = new JObject(); 
      foreach (DataColumn col in tbl.Columns) 
      { 
       jo.Add(new JProperty(col.ColumnName.ToString(), row[col].ToString())); 
      } 
      jArray.Add(jo); 

      query = "i have query to get child"; 
      dataToJson(connection_string, query, table_child);     
     } 
    } 
    catch (Exception e) 
    { 
     WriteLog(e.Message, GetCurrentMethod(e)); 
    } 
} 

ответ

0

Вы должны передать родительский элемент или вернуть его в этот рекурсивный метод. Кроме того, вам не нужно открывать SqlConnection каждый раз, если все таблицы находятся в одной базе данных.
Вот пример прохождения родителя:

// Caller 
JObject root = new JObject(); 
using (SqlConnection conn = new SqlConnection(connection_string)) 
{ 
    conn.Open(); 
    dataToJson(root, conn, query, "TableA"); 
} 
Console.WriteLine(root.ToString()); 


static void dataToJson(JObject parent, SqlConnection conn, string query, string table_name) 
{ 
    if (string.IsNullOrEmpty(table_name)) { return; } 
    try 
    { 
     JArray jArray = new JArray(); 
     DataTable tbl = new DataTable(); 
     //DataTable inner_tbl = new DataTable(); 
     //SqlConnection conn = new SqlConnection(connection_string); 
     //conn.Open(); 
     var adapter = new SqlDataAdapter(query, conn); // query to get parent 
     adapter.Fill(tbl); 
     foreach (DataRow row in tbl.Rows) 
     { 
      JObject jo = new JObject(); 
      foreach (DataColumn col in tbl.Columns) 
      { 
       jo.Add(new JProperty(col.ColumnName.ToString(), row[col].ToString())); 
      } 
      query = "i have query to get child"; 
      // Set the child table name to "table_child" 
      dataToJson(jo, conn, query, table_child); // Pass the JObject as the parent 

      jArray.Add(jo); 
      parent.Add(new JProperty(table_name, jArray)); 
     } 
    } 
    catch (Exception e) 
    { 
     WriteLog(e.Message, GetCurrentMethod(e)); 
    } 
} 

Кстати, я не знаю, как вы получите имя ребенка таблицы, поэтому я использовал следующий словарь для тестирования.

static Dictionary<string, string> table_hierarchy = new Dictionary<string, string>(); 
// Initialize 
table_hierarchy.Add("TableA", "TableB"); 
table_hierarchy.Add("TableB", "TableC"); 
table_hierarchy.Add("TableC", ""); 
+0

Это работа только 2 записи на TableA. 3 следующая запись получилась ошибка. Не удается добавить свойство TableB в Newtonsoft.Json.Linq.JObject. Имущество с тем же именем уже существует на объекте. – frenzybluez

+0

теперь он отлично работает, после ловли без исключения. Большое спасибо. – frenzybluez

+0

Благодарим вас за то, что отметили мой ответ как лучший ответ. Дайте мне знать, если мне нужно что-то обновить. – jhmt

Смежные вопросы