关于接口JSON格式(DataTable转换成JSON数据)
#region 工单表关联串JSON数据
/// <summary>
/// 主子档串JSON数据
/// </summary>
/// <param name="jsonName">docType的名字</param>
/// <param name="dt">工单的数据集DataTable</param>
/// <param name="strSubSql">子档的SQL语句,如果没有条件必须加WHERE 1=1 </param>
/// <param name="strMasterGkey">子档在JSON 中的标题名称,即子档“["符号前的名称</param>
/// <param name="strSubGkeys">子档与主档相关联的字段名 格式:子档的字段名#主档的字段名 eg:"erp_mo#erp_mo</param>
/// <param name="strStoreSql">子档中取得仓位的SQL语句</param>
/// <param name="strStoreRef">仓位的节点名</param>
/// <param name="UpdateType"></param>
/// <returns></returns>
public string WoGetJsonReturn(string jsonName, string UpdateType, DataTable dt, string strSubSql, string strSubTableName, string strStoreSql, string strStoreRef, string[] strSubGkeys)
{
StringBuilder Json = new StringBuilder();
Json.Append("{");
Json.Append("\"docType\": \"" + jsonName + "\",");
Json.Append("\"updateType\": \"" + UpdateType + "\",");
if (dt.Rows.Count > 0)
{
Json.Append("\"data\": [");
for (int i = 0; i < dt.Rows.Count; i++)
{
Json.Append("{");
for (int j = 0; j < dt.Columns.Count; j++)
{
// Json.Append(dt.Columns[j].ColumnName.ToString() + ":\"" + dt.Rows[i][j].ToString() + "\"");
Type dataType = dt.Columns[dt.Columns[j].ColumnName.ToString()].DataType;
if (dataType.Name == "Decimal" || dataType.Name == "Int32")
// Json.Append("\"" + dt.Columns[j].ColumnName.ToString().ToLower() + "\":" + dt.Rows[i][j].ToString().Replace(@"\", "\\\\").Replace("\"", "\\\"").Trim());
Json.Append("\"" + dt.Columns[j].ColumnName.ToString().ToLower() + "\":" + dt.Rows[i][j].ToString().Replace(@"\", "\\\\").Replace("\"", "\\\"").Replace("\n", "").Replace("\t", "").Replace("\r", "").Trim());
else
Json.Append("\"" + dt.Columns[j].ColumnName.ToString().ToLower() + "\":\"" + dt.Rows[i][j].ToString().Replace(@"\", "\\\\").Replace("\"", "\\\"").Replace("\n", "").Replace("\t", "").Replace("\r", "").Trim() + "\"");
if (j < dt.Columns.Count - 1)
{
Json.Append(",");
}
}
if (strSubSql != "")
{
string strSearchSql = strSubSql;
if (strSubGkeys.Length > 0)
{
for (int m = 0; m < strSubGkeys.Length; m++)
{
strSearchSql += " AND " + strSubGkeys[m].Split('#')[0] + "='" + dt.Rows[i][strSubGkeys[m].Split('#')[1]].ToString() + "'";
}
}
DataTable dtSub = SqlDBOps.SqlDBOps.ExecuteReader(strSearchSql, "ERP_ACC");
if (dtSub != null)
{
if (dtSub.Rows.Count > 0)
{
//dtSub = MergeDataTableRow(dtSub);
Json.Append(",");
Json.Append("\"" + strSubTableName + "\": [");
for (int t = 0; t < dtSub.Rows.Count; t++)
{
Json.Append("{");
for (int k = 0; k < dtSub.Columns.Count; k++)
{
Type dataTypeSub = dtSub.Columns[dtSub.Columns[k].ColumnName.ToString()].DataType;
if (dataTypeSub.Name == "Decimal" || dataTypeSub.Name == "Int32")
// Json.Append("\"" + dtSub.Columns[k].ColumnName.ToString() + "\":" + dtSub.Rows[t][k].ToString().Replace(@"\", "\\\\").Replace("\"", "\\\"").Trim());
Json.Append("\"" + dtSub.Columns[k].ColumnName.ToString() + "\":" + dtSub.Rows[t][k].ToString().Replace(@"\", "\\\\").Replace("\"", "\\\"").Replace("\n", "").Replace("\t", "").Replace("\r", "").Trim());
else
Json.Append("\"" + dtSub.Columns[k].ColumnName.ToString().ToLower() + "\":\"" + dtSub.Rows[t][k].ToString().Replace(@"\", "\\\\").Replace("\"", "\\\"").Replace("\n", "").Replace("\t", "").Replace("\r", "").Trim() + "\"");
if (k < dtSub.Columns.Count - 1)
{
Json.Append(",");
}
}
Json.Append("}");
if (t < dtSub.Rows.Count - 1)
{
Json.Append(",");
}
}
Json.Append("]");
}
}
}
if (strStoreSql != "")
{
string strGetStoreSql = strStoreSql;
if (strSubGkeys.Length > 0)
{
for (int m = 0; m < strSubGkeys.Length; m++)
{
strGetStoreSql += " AND " + strSubGkeys[m].Split('#')[0] + "='" + dt.Rows[i][strSubGkeys[m].Split('#')[1]].ToString() + "'";
}
}
//1.根据Order_No、Client_Code 两个字段去重,distinct之后的table只保留括号内写的字段
//DataTable DtHeadDis = DtEntities.DefaultView.ToTable(true, "Order_No", "Client_Code")
DataTable dtStore = SqlDBOps.SqlDBOps.ExecuteReader(strGetStoreSql, "ERP_ACC");
if (dtStore != null)
{
if (dtStore.Rows.Count > 0)
{
Json.Append(",");
Json.Append("\"" + strStoreRef + "\": [");
for (int t = 0; t < dtStore.Rows.Count; t++)
{
Json.Append("{");
for (int k = 0; k < dtStore.Columns.Count; k++)
{
Type dataTypeStore = dtStore.Columns[dtStore.Columns[k].ColumnName.ToString()].DataType;
if (dataTypeStore.Name == "Decimal" || dataTypeStore.Name == "Int32")
Json.Append("\"" + dtStore.Columns[k].ColumnName.ToString() + "\":" + dtStore.Rows[t][k].ToString().Replace(@"\", "\\\\").Replace("\"", "\\\"").Trim());
else
Json.Append("\"" + dtStore.Columns[k].ColumnName.ToString().ToLower() + "\":\"" + dtStore.Rows[t][k].ToString() + "\"");
if (k < dtStore.Columns.Count - 1)
{
Json.Append(",");
}
}
Json.Append("}");
if (t < dtStore.Rows.Count - 1)
{
Json.Append(",");
}
}
Json.Append("]");
}
}
}
Json.Append("}");
if (i < dt.Rows.Count - 1)
{
Json.Append(",");
}
}
Json.Append("]");
}
Json.Append("}");
return Json.ToString();
}
#endregion
------------------------------------------------------------------------
string strMsgJson = WoGetJsonReturn("BS_WPLAN", "UPDATE", dt, "SELECT MTRL_CODE,DOSAGE,NN_QTY,TN_QTY,NN_QTY_S,TN_QTY_S,IS_MAIN,MAIN_CODE, POINT_STR,'' REMARK from apps.pcp_jobno_view1 where 1=1 ", "bs_wplan_mn_mtrl", strThirdSql, "bs_mn_store", strSubGkeys);
JSON格式:
{"docType":"BS_WPLAN","updateType":"UPDATE","data": [{"erp_mo":"5340XXX","prod_code":"283-XXXX-0000B","p_qty":70,"pb_date":"2025-09-21 00:00:00","pe_date":"2025-09-21 00:00:00","mo_type":0,"phase_code":"SMT","erp_org_id":45,"is_bonded":"N","org_id":"MU1","first_bom_side":"2","ord_code":".","po_code":"2200005398","cust_code":"","remark258":",","bs_wplan_mn_mtrl":[{"mtrl_code":"262-XX062-9799F","DOSAGE":89,"NN_QTY":69420,"TN_QTY":69420,"NN_QTY_S":69420,"TN_QTY_S":69420,"is_main":"Y","main_code":"262-XX062-9799F","point_str":"C12,C2604","remark":""},{"mtrl_code":"163-XX009-0289F","DOSAGE":4,"NN_QTY":3120,"TN_QTY":3120,"NN_QTY_S":3120,"TN_QTY_S":3120,"is_main":"Y","main_code":"163-XX009-0289F","point_str":"R3603,R8410","remark":""},{"mtrl_code":"162-031XX-0289F","DOSAGE":2,"NN_QTY":1560,"TN_QTY":1560,"NN_QTY_S":1560,"TN_QTY_S":1560,"is_main":"Y","main_code":"162-03XX1-0289F","point_str":"C3600,C3602","remark":""},{"mtrl_code":"163-00102-0299F","DOSAGE":4,"NN_QTY":3120,"TN_QTY":3120,"NN_QTY_S":3120,"TN_QTY_S":3120,"is_main":"Y","main_code":"163-0XX02-0299F","point_str":"R90,R1207","remark":""},{"mtrl_code":"163-00103-0299F","DOSAGE":22,"NN_QTY":17160,"TN_QTY":17160,"NN_QTY_S":17160,"TN_QTY_S":17160,"is_main":"Y","main_code":"1XX-00103-0299F","point_str":"R66,R8011","remark":""}],"bs_mn_store": [{"store_code":"AP3102"}]}]}