将多个 Datatable 层次结构递归序列化为 JSON object
Recursively serialize multiple Datatable hierarchies to JSON object
我想将多个相互关联的数据Table序列化为JSON,并且可能会有额外的table都在映射table中设置.在这种情况下,我有 3 个 DataTables.
- Table A 作为 parent
- Table B作为Table A
的child
- TableC作为TableB
的child
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));
}
}
你必须在这个递归方法中传递 parent 或 return 和 child。此外,如果所有 table 都在同一数据库中,则不必每次都打开 SqlConnection
。
下面是传递 parent 的示例:
// 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));
}
}
顺便说一下,我不确定你是怎么得到 child table 的名字的,所以我使用了下面的字典进行测试。
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", "");
我想将多个相互关联的数据Table序列化为JSON,并且可能会有额外的table都在映射table中设置.在这种情况下,我有 3 个 DataTables.
- Table A 作为 parent
- Table B作为Table A 的child
- TableC作为TableB 的child
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));
}
}
你必须在这个递归方法中传递 parent 或 return 和 child。此外,如果所有 table 都在同一数据库中,则不必每次都打开 SqlConnection
。
下面是传递 parent 的示例:
// 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));
}
}
顺便说一下,我不确定你是怎么得到 child table 的名字的,所以我使用了下面的字典进行测试。
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", "");