using System; using System.Collections.Generic; using System.Data; using System.Text; using BP.En; using BP.DA; namespace BP.Tools { /// /// 返回信息格式 /// /// public class MethodReturnMessage { /// /// 是否运行成功 /// public bool Success { get; set; } /// /// 信息 /// public string Message { get; set; } /// /// 返回的数据 /// public T Data { get; set; } } public class Entitis2Json { private volatile static Entitis2Json _instance = null; private Entitis2Json() { } public static Entitis2Json Instance { get { if (_instance == null) _instance = new Entitis2Json(); return _instance; } } /// /// 将实体类转为json List格式数据 /// /// 实体集合类 /// public static string ConvertEntities2ListJson(Entities ens) { return Instance.TranslateEntitiesToListJson(ens, null); } /// /// 将实体类转为json List格式数据 /// /// 实体集合类 /// 需要隐藏的列,如:@No@Name /// public static string ConvertEntities2ListJson(Entities ens, string hidenKeys) { return Instance.TranslateEntitiesToListJson(ens, hidenKeys); } /// /// 将Entitis转换为树形的json /// /// 实体集合类 /// 根节点编号 /// public static string ConvertEntitis2GenerTree(Entities ens, string rootNo) { return Instance.TansEntitiesToGenerTree(ens, rootNo); } /// /// 将Entitis转换为树形的gridjson /// /// 树形实体类 /// 父节点列名 /// 子节点列名 /// 父编号 /// 是否加载子节点 /// 树形的gridjson public static string ConvertEntitis2GridTree(EntitiesTree ens, string pColumnName, string cColumnName, string ParentNo, bool appendChild) { return Instance.TansEntitiesToGridTree(ens, pColumnName, cColumnName, ParentNo, appendChild); } /// /// 将实体类转为json格式数据 /// /// 实体集合类 /// public static string ConvertEntitis2GridJsonOnlyData(Entities ens) { return Instance.TranslateEntitiesToGridJsonOnlyData(ens, 0, null); } /// /// 将实体类转为json格式数据用于分页 /// /// 实体集合类 /// 总行数 /// public static string ConvertEntitis2GridJsonOnlyData(Entities ens, int totalRows) { return Instance.TranslateEntitiesToGridJsonOnlyData(ens, totalRows, null); } /// /// 将实体类转为json格式数据 /// /// 实体集合类 /// 需要隐藏的列,如:@No@Name /// public static string ConvertEntitis2GridJsonOnlyData(Entities ens, string hidenKeys) { return Instance.TranslateEntitiesToGridJsonOnlyData(ens, 0, hidenKeys); } /// /// 将实体类转为json格式数据用于分页 /// /// 实体集合类 /// 总行数 /// 需要隐藏的列,如:@No@Name /// public static string ConvertEntitis2GridJsonOnlyData(Entities ens, int totalRows, string hidenKeys) { return Instance.TranslateEntitiesToGridJsonOnlyData(ens, totalRows, hidenKeys); } /// /// 将实体集合类转为json格式 包含列名和数据 /// /// 实体集合类 /// Json格式数据 public static string ConvertEntitis2GridJsonAndData(Entities ens) { return Instance.TranslateEntitiesToGridJsonColAndData(ens, 0, null); } /// /// 将实体集合类转为json格式 包含列名和数据 /// /// 实体集合类 /// 总行数 /// Json格式数据 public static string ConvertEntitis2GridJsonAndData(Entities ens, int totalRows) { return Instance.TranslateEntitiesToGridJsonColAndData(ens, totalRows, null); } /// /// 将实体集合类转为json格式 包含列名和数据 /// /// 实体集合类 /// 需要隐藏的列,如:@No@Name /// public static string ConvertEntitis2GridJsonAndData(Entities ens, string hidenKeys) { return Instance.TranslateEntitiesToGridJsonColAndData(ens, 0, hidenKeys); } /// /// 将实体集合类转为json格式 包含列名和数据 /// /// 实体集合类 /// 总行数 /// 需要隐藏的列,如:@No@Name /// public static string ConvertEntitis2GridJsonAndData(Entities ens, int totalRows, string hidenKeys) { return Instance.TranslateEntitiesToGridJsonColAndData(ens, totalRows, hidenKeys); } /// /// 将实体类转为json格式 /// /// /// 隐藏字段 /// public string TranslateEntityToJson(BP.En.Entity en, string hidenKeys) { Attrs attrs = en.EnMap.Attrs; StringBuilder append = new StringBuilder(); append.Append("{"); foreach (Attr attr in attrs) { if (!DataType.IsNullOrEmpty(hidenKeys) && hidenKeys.Contains("@" + attr.Key)) continue; string strValue = en.GetValStrByKey(attr.Key); if (!DataType.IsNullOrEmpty(strValue) && strValue.LastIndexOf("\\") > -1) { strValue = strValue.Substring(0, strValue.LastIndexOf("\\")); } append.Append(attr.Key + ":'" + strValue + "',"); } append = append.Remove(append.Length - 1, 1); append.Append("}"); return ReplaceIllgalChart(append.ToString()); } /// /// 将实体类转为json格式List /// /// /// 隐藏字段 /// public string TranslateEntitiesToListJson(BP.En.Entities ens, string hidenKeys) { Attrs attrs = ens.GetNewEntity.EnMap.Attrs; StringBuilder append = new StringBuilder(); append.Append("["); foreach (Entity en in ens) { append.Append("{"); foreach (Attr attr in attrs) { if (!DataType.IsNullOrEmpty(hidenKeys) && hidenKeys.Contains("@" + attr.Key)) continue; string strValue = en.GetValStrByKey(attr.Key); if (!DataType.IsNullOrEmpty(strValue) && strValue.EndsWith("\\") == true) { strValue = strValue.Substring(0, strValue.LastIndexOf("\\")); } strValue = strValue == null ? "" : strValue.Trim(); append.Append(attr.Key + ":'" + strValue + "',"); } append = append.Remove(append.Length - 1, 1); append.Append("},"); } if (append.Length > 1) append = append.Remove(append.Length - 1, 1); append.Append("]"); return ReplaceIllgalChart(append.ToString()); } /// /// 将实体类转为json格式 /// /// /// /// public string TranslateEntitiesToGridJsonOnlyData(BP.En.Entities ens, int totalRows, string hidenKeys) { Attrs attrs = ens.GetNewEntity.EnMap.Attrs; StringBuilder append = new StringBuilder(); append.Append("{rows:["); foreach (Entity en in ens) { append.Append("{"); foreach (Attr attr in attrs) { if (!DataType.IsNullOrEmpty(hidenKeys) && hidenKeys.Contains("@" + attr.Key)) continue; string strValue = en.GetValStrByKey(attr.Key); if (!DataType.IsNullOrEmpty(strValue) && strValue.EndsWith("\\")) { strValue = strValue.Substring(0, strValue.LastIndexOf("\\")); } append.Append(attr.Key + ":'" + strValue + "',"); } append = append.Remove(append.Length - 1, 1); append.Append("},"); } //长度超过{rows:[才进行截取 if (append.Length > 7) append = append.Remove(append.Length - 1, 1); if (totalRows == 0) { append.Append("],total:"); append.Append(ens != null ? ens.Count : 0); } else { append.Append("],total:" + totalRows); } append.Append("}"); return ReplaceIllgalChart(append.ToString()); } /// /// 将实体类转为json格式 包含列名和数据 /// /// /// /// public string TranslateEntitiesToGridJsonColAndData(Entities ens, int totalRows, string hidenKeys) { Attrs attrs = ens.GetNewEntity.EnMap.Attrs; StringBuilder append = new StringBuilder(); append.Append("{"); //整理列名 append.Append("columns:["); foreach (Attr attr in attrs) { if (attr.UIVisible == false) continue; if (!DataType.IsNullOrEmpty(hidenKeys) && hidenKeys.Contains("@" + attr.Key)) continue; if (attr.MyFieldType == FieldType.RefText) continue; if (attr.IsRefAttr || attr.IsFK || attr.IsEnum) { append.Append("{"); append.Append(string.Format("field:'{0}',title:'{1}',width:{2},sortable:true", attr.Key + "Text", attr.Desc, attr.UIWidth * 2)); append.Append("},"); continue; } append.Append("{"); append.Append(string.Format("field:'{0}',title:'{1}',width:{2},sortable:true", attr.Key, attr.Desc, attr.UIWidth * 2)); append.Append("},"); } if (append.Length > 10) append = append.Remove(append.Length - 1, 1); append.Append("]"); //整理数据 bool bHaveData = false; append.Append(",data:{rows:["); foreach (Entity en in ens) { bHaveData = true; append.Append("{"); foreach (Attr attr in attrs) { //if (attr.IsRefAttr || attr.UIVisible == false) // continue; if (attr.MyFieldType == FieldType.RefText) continue; if (attr.IsRefAttr || attr.IsFK || attr.IsEnum) { append.Append(attr.Key + "Text:'" + en.GetValRefTextByKey(attr.Key) + "',"); continue; } append.Append(attr.Key + ":'" + en.GetValStrByKey(attr.Key) + "',"); } append = append.Remove(append.Length - 1, 1); append.Append("},"); } if (append.Length > 11 && bHaveData) append = append.Remove(append.Length - 1, 1); append.Append("],total:" + totalRows + "}"); append.Append("}"); return ReplaceIllgalChart(append.ToString()); } /// /// /// /// /// /// /// /// /// public string TansEntitiesToGridTree(EntitiesTree ens, string pColumnName, string cColumnName, string ParentNo, bool appendChild) { StringBuilder stringbuilder = new StringBuilder(); Attrs attrs = ens.GetNewEntity.EnMap.Attrs; stringbuilder.Append("["); foreach (EntityTree en in ens) { stringbuilder.Append("{"); foreach (Attr attr in attrs) { string chidstring = TansEntitiesToGridTree(ens, pColumnName, cColumnName, en.GetValStrByKey(cColumnName), appendChild); if (!DataType.IsNullOrEmpty(chidstring) && appendChild == true) { stringbuilder.Append(TranslateEntityToJson(en, "")); stringbuilder.Replace('}', ',', stringbuilder.Length - 1, 1); stringbuilder.Append("children:"); stringbuilder.Append(chidstring); } else { stringbuilder.Append(TranslateEntityToJson(en, "")); stringbuilder.Append(","); } if (attr.IsRefAttr || attr.IsFK || attr.IsEnum) { stringbuilder.Append(attr.Key + "Text:'" + en.GetValRefTextByKey(attr.Key) + "',"); continue; } stringbuilder.Append(attr.Key + ":'" + en.GetValStrByKey(attr.Key) + "',"); } stringbuilder.Replace(',', ' ', stringbuilder.Length - 1, 1); stringbuilder.Append("]},"); } return stringbuilder.ToString(); } /// /// 将实体转为树形 /// /// /// StringBuilder appendMenus = new StringBuilder(); StringBuilder appendMenuSb = new StringBuilder(); public string TansEntitiesToGenerTree(Entities ens, string rootNo) { appendMenus = new StringBuilder(); appendMenuSb = new StringBuilder(); EntityTree root = ens.GetEntityByKey(EntityTreeAttr.ParentNo, rootNo) as EntityTree; if (root == null) throw new Exception("@没有找到rootNo=" + rootNo + "的entity."); appendMenus.Append("[{"); appendMenus.Append("'id':'" + root.No + "'"); appendMenus.Append(",'text':'" + root.Name + "'"); appendMenus.Append(",'state':'open'"); // 增加它的子级. appendMenus.Append(",'children':"); AddChildren(root, ens); appendMenus.Append(appendMenuSb); appendMenus.Append("}]"); return ReplaceIllgalChart(appendMenus.ToString()); } public void AddChildren(EntityTree parentEn, Entities ens) { appendMenus.Append(appendMenuSb); appendMenuSb.Clear(); appendMenuSb.Append("["); foreach (EntityTree item in ens) { if (item.ParentNo != parentEn.No) continue; appendMenuSb.Append("{'id':'" + item.No + "','text':'" + item.Name + "','state':'closed'"); EntityTree treeNode = ens.GetEntityByKey(EntityTreeAttr.ParentNo, item.No) as EntityTree; if (treeNode != null) { // 增加它的子级. appendMenuSb.Append(",'children':"); AddChildren(item, ens); } appendMenuSb.Append("},"); } if (appendMenuSb.Length > 1) appendMenuSb = appendMenuSb.Remove(appendMenuSb.Length - 1, 1); appendMenuSb.Append("]"); appendMenus.Append(appendMenuSb); appendMenuSb.Clear(); } /// /// 去除特殊字符 /// /// /// public string ReplaceIllgalChart(string s) { StringBuilder sb = new StringBuilder(); for (int i = 0, j = s.Length; i < j; i++) { char c = s[i]; switch (c) { case '\"': sb.Append("\\\""); break; case '\\': sb.Append("\\\\"); break; case '/': sb.Append("\\/"); break; case '\b': sb.Append("\\b"); break; case '\f': sb.Append("\\f"); break; case '\n': sb.Append("\\n"); break; case '\r': sb.Append("\\r"); break; case '\t': sb.Append("\\t"); break; default: sb.Append(c); break; } } return sb.ToString(); } } } namespace BP.DA { public class DataTableConvertJson { #region dataTable转换成Json格式 /// /// dataTable转换成Json格式 /// /// /// public static string DataTable2Json(DataTable dt) { StringBuilder jsonBuilder = new StringBuilder(); jsonBuilder.Append("["); for (int i = 0; i < dt.Rows.Count; i++) { jsonBuilder.Append("{"); for (int j = 0; j < dt.Columns.Count; j++) { jsonBuilder.Append("\""); jsonBuilder.Append(dt.Columns[j].ColumnName); jsonBuilder.Append("\":\""); jsonBuilder.Append(dt.Rows[i][j].ToString()); jsonBuilder.Append("\","); } jsonBuilder.Remove(jsonBuilder.Length - 1, 1); jsonBuilder.Append("},"); } if (jsonBuilder.Length > 1) jsonBuilder.Remove(jsonBuilder.Length - 1, 1); jsonBuilder.Append("]"); return jsonBuilder.ToString(); } /// /// 替换特殊字符,避免json解析时报错 秦-2015-5-20 /// /// 需要替换的原始字符串 /// public static string GetFilteredStrForJSON(string getText, bool checkId) { if (checkId) { getText = getText.Replace("\n", ""); } else { getText = getText.Replace("\n", "ccflow_lover"); } getText = getText.Replace("\n", ""); getText = getText.Replace("\r", ""); getText = getText.Replace("{", "{"); getText = getText.Replace("}", "}"); getText = getText.Replace("[", "【"); getText = getText.Replace("]", "】"); getText = getText.Replace("\"", "”"); getText = getText.Replace("\'", "‘"); getText = getText.Replace("<", "《"); getText = getText.Replace(">", "》"); getText = getText.Replace("(", "("); getText = getText.Replace(")", ")"); return getText; } /// /// dataTable转换成Json格式 秦2014年06月23日 17:11 /// /// 表 /// 总行数 /// public static string DataTable2Json(DataTable dt, int totalRows) { StringBuilder jsonBuilder = new StringBuilder(); jsonBuilder.Append("{\"rows\":["); for (int i = 0; i < dt.Rows.Count; i++) { jsonBuilder.Append("{"); for (int j = 0; j < dt.Columns.Count; j++) { jsonBuilder.Append("\""+dt.Columns[j].ColumnName.ToUpper()+"\""); jsonBuilder.Append(":"); jsonBuilder.Append("\"" + GetFilteredStrForJSON(dt.Rows[i][j].ToString(), true) + "\""); jsonBuilder.Append(","); } jsonBuilder.Remove(jsonBuilder.Length - 1, 1); jsonBuilder.Append("},"); } //不存在数据时 if (jsonBuilder.Length > 11) { jsonBuilder.Remove(jsonBuilder.Length - 1, 1); } //jsonBuilder.Remove(jsonBuilder.Length - 1, 1); if (totalRows == 0) { jsonBuilder.Append("],\"total\":0"); } else { jsonBuilder.Append("],\"total\":" + totalRows); } jsonBuilder.Append("}"); return jsonBuilder.ToString(); } #endregion dataTable转换成Json格式 #region DataSet转换成Json格式 /// /// DataSet转换成Json格式 /// /// DataSet /// public static string Dataset2Json(DataSet ds) { StringBuilder json = new StringBuilder(); json.Append("["); foreach (DataTable dt in ds.Tables) { json.Append("{\""); json.Append(dt.TableName); json.Append("\":"); json.Append(DataTable2Json(dt)); json.Append("},"); } if (json.Length > 1) { json.Remove(json.Length - 1, 1); } json.Append("]"); return json.ToString(); } #endregion /// /// Msdn /// /// /// /// public static string DataTableToJson(string jsonName, DataTable dt) { StringBuilder Json = new StringBuilder(); Json.Append("{\"" + jsonName + "\":["); if (dt.Rows.Count > 0) { 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() + "\""); if (j < dt.Columns.Count - 1) { Json.Append(","); } } Json.Append("}"); if (i < dt.Rows.Count - 1) { Json.Append(","); } } } Json.Append("]}"); return Json.ToString(); } /// /// 根据DataTable生成Json树结构 /// /// 数据源 /// ID列 /// Text列 /// 关系字段 /// 父ID ///easyui tree json格式 public static string TransDataTable2TreeJson(DataTable tabel, string idCol, string txtCol, string rela, object pId) { treeResult = new StringBuilder(); treesb = new StringBuilder(); return GetTreeJsonByTable(tabel, idCol, txtCol, rela, pId); } /// /// 根据DataTable生成Json树结构 /// /// 数据源 /// ID列 /// Text列 /// 关系字段 /// 父ID ///easyui tree json格式 static StringBuilder treeResult = new StringBuilder(); static StringBuilder treesb = new StringBuilder(); private static string GetTreeJsonByTable(DataTable tabel, string idCol, string txtCol, string rela, object pId) { string treeJson = string.Empty; string treeState = "close"; treeResult.Append(treesb.ToString()); treesb.Clear(); if (treeResult.Length == 0) { treeState = "open"; } if (tabel.Rows.Count > 0) { treesb.Append("["); string filer = string.Empty; if (pId.ToString() == "") { filer = string.Format("{0} is null", rela); } else { filer = string.Format("{0}='{1}'", rela, pId); } DataRow[] rows = tabel.Select(filer); if (rows.Length > 0) { foreach (DataRow row in rows) { treesb.Append("{\"id\":\"" + row[idCol] + "\",\"text\":\"" + row[txtCol] + "\",\"state\":\"" + treeState + "\""); if (tabel.Select(string.Format("{0}='{1}'", rela, row[idCol])).Length > 0) { treesb.Append(",\"children\":"); GetTreeJsonByTable(tabel, idCol, txtCol, rela, row[idCol]); treeResult.Append(treesb.ToString()); treesb.Clear(); } treeResult.Append(treesb.ToString()); treesb.Clear(); treesb.Append("},"); } treesb = treesb.Remove(treesb.Length - 1, 1); } treesb.Append("]"); treeResult.Append(treesb.ToString()); treeJson = treeResult.ToString(); treesb.Clear(); } return treeJson; } } }