public static bool ExportTableToJson(TableInfo tableInfo, out string errorString) { StringBuilder content = new StringBuilder(); // 若生成为各行数据对应的json object包含在一个json array的形式 if (JsonStruct.ExportJsonIsExportJsonArrayFormat == true) { // 生成json字符串开头,每行数据为一个json object,作为整张表json array的元素 content.Append("["); // 逐行读取表格内容生成json List<FieldInfo> allField = tableInfo.GetAllClientFieldInfo(); int dataCount = tableInfo.GetKeyColumnFieldInfo().Data.Count; int fieldCount = allField.Count; for (int row = 0; row < dataCount; ++row) { // 生成一行数据json object的开头 content.Append("{"); for (int column = 0; column < fieldCount; ++column) { string oneFieldString = _GetOneField(allField[column], row, out errorString); if (errorString != null) { errorString = string.Format("导出表格{0}为json文件失败,", tableInfo.TableName) + errorString; return false; } else { content.Append(oneFieldString); } } // 去掉本行最后一个字段后多余的英文逗号,json语法不像lua那样最后一个字段后的逗号可有可无 content.Remove(content.Length - 1, 1); // 生成一行数据json object的结尾 content.Append("}"); // 每行的json object后加英文逗号 content.Append(","); } // 去掉最后一行后多余的英文逗号,此处要特殊处理当表格中没有任何数据行时的情况 if (content.Length > 1) content.Remove(content.Length - 1, 1); // 生成json字符串结尾 content.Append("]"); } else { // 生成json字符串开头,每行数据以表格主键列为key,各字段信息组成的json object为value,作为整张表json object的元素 content.Append("{"); // 逐行读取表格内容生成json List<FieldInfo> allField = tableInfo.GetAllClientFieldInfo(); FieldInfo keyColumnInfo = tableInfo.GetKeyColumnFieldInfo(); int dataCount = keyColumnInfo.Data.Count; int fieldCount = allField.Count; for (int row = 0; row < dataCount; ++row) { // 将主键列的值作为key string keyString = null; StringBuilder contentkey = new StringBuilder(); if (keyColumnInfo.DataType == DataType.String) { keyString = _GetStringValue(keyColumnInfo, row); contentkey.Append(keyString); } else if (keyColumnInfo.DataType == DataType.Int || keyColumnInfo.DataType == DataType.Long) { keyString = _GetNumberValue(keyColumnInfo, row); contentkey.Append("\"").Append(keyString).Append("\""); } else { errorString = string.Format("ExportTableToJson函数中未定义{0}类型的主键数值导出至json文件的形式", keyColumnInfo.DataType); AppLog.LogErrorAndExit(errorString); return false; } StringBuilder contenvalue = new StringBuilder(); int startColumn = (JsonStruct.ExportJsonIsExportJsonMapIncludeKeyColumnValue == true ? 0 : 1); for (int column = startColumn; column < fieldCount; ++column) { string oneFieldString = _GetOneField(allField[column], row, out errorString); if (errorString != null) { errorString = string.Format("额外导出表格{0}为json文件失败,", tableInfo.TableName) + errorString; return false; } else { contenvalue.Append(oneFieldString); } } string str = contenvalue.ToString(); if (JsonStruct.ExportJsonIsExportJsonMapIncludeKeyColumnValue == true) { // 生成一行数据json object的开头 content.Append(contentkey); content.Append(":{"); content.Append(contenvalue); // 去掉本行最后一个字段后多余的英文逗号,json语法不像lua那样最后一个字段后的逗号可有可无 content.Remove(content.Length - 1, 1); // 生成一行数据json object的结尾 content.Append("}"); // 每行的json object后加英文逗号 content.Append(","); } else if (str != "") { // 生成一行数据json object的开头 content.Append(contentkey); content.Append(":{"); content.Append(contenvalue); // 去掉本行最后一个字段后多余的英文逗号,json语法不像lua那样最后一个字段后的逗号可有可无 content.Remove(content.Length - 1, 1); // 生成一行数据json object的结尾 content.Append("}"); // 每行的json object后加英文逗号 content.Append(","); } } // 去掉最后一行后多余的英文逗号,此处要特殊处理当表格中没有任何数据行时的情况 if (content.Length > 1) content.Remove(content.Length - 1, 1); // 生成json字符串结尾 content.Append("}"); } string exportString = content.ToString(); // 如果声明了要整理为带缩进格式的形式 if (JsonStruct.ExportJsonIsFormat == true) exportString = _FormatJson(exportString); // 保存为json文件 if (SaveJson.SaveJsonFile(tableInfo.ExcelName, ExcelMethods.GetSaveTableName(tableInfo.TableName), exportString) == true) { errorString = null; //try //{ // LitJson.JsonData jsonData = LitJson.JsonMapper.ToObject(exportString); //} //catch (LitJson.JsonException exception) //{ // errorString = "错误:导出json出现异常,请检查导出的json及Excel\n"; //} return true; } else { errorString = "保存为json文件失败\n"; return false; } }
/// <summary> /// 按配置的特殊索引导出方式输出json文件(如果声明了在生成的json文件开头以注释形式展示列信息,将生成更直观的嵌套字段信息,而不同于普通导出规则的列信息展示) /// </summary> public static bool SpecialExportTableToJson(TableInfo tableInfo, string exportRule, out string errorString) { exportRule = exportRule.Trim(); // 解析按这种方式导出后的json文件名 int colonIndex = exportRule.IndexOf(':'); // 解析table value中要输出的字段名 List <FieldInfo> tableValueField = new List <FieldInfo>(); // 解析完依次作为索引的字段以及table value中包含的字段后,按索引要求组成相应的嵌套数据结构 Dictionary <object, object> data = new Dictionary <object, object>(); //自定义导出规则检查 TableCheckHelper.CheckSpecialExportRule(tableInfo, exportRule, out tableValueField, out data, out errorString); if (errorString != null) { errorString = string.Format("错误:对表格{0}按\"{1}\"规则进行特殊索引导出时发现以下错误,导出被迫停止,请修正错误后重试:\n{2}\n", tableInfo.TableName, exportRule, errorString); return(false); } // 生成导出的文件内容 StringBuilder content = new StringBuilder(); // 生成数据内容开头 content.Append("{");//content.AppendLine("{"); // 当前缩进量 int currentLevel = 1; // 逐层按嵌套结构输出数据 _GetIndexFieldData(content, data, tableValueField, ref currentLevel, out errorString); if (errorString != null) { errorString = string.Format("错误:对表格{0}按\"{1}\"规则进行特殊索引导出时发现以下错误,导出被迫停止,请修正错误后重试:\n{2}\n", tableInfo.TableName, exportRule, errorString); return(false); } // 去掉最后一个子元素后多余的英文逗号 content.Remove(content.Length - 1, 1); // 生成数据内容结尾 content.AppendLine("}"); string exportString = content.ToString(); // 如果声明了要整理为带缩进格式的形式 if (JsonStruct.ExportJsonIsFormat == true) { exportString = _FormatJson2(exportString); // exportString = JsonConvert.SerializeObject(exportString); } // 保存为json文件 string fileName = exportRule.Substring(0, colonIndex).Trim(); if (SaveJson.SaveJsonFile(tableInfo.ExcelName, ExcelMethods.GetSaveTableName(fileName), exportString) == true) { errorString = null; try { LitJson.JsonData jsonData = LitJson.JsonMapper.ToObject(exportString); } catch (LitJson.JsonException exception) { errorString = "错误:导出json出现异常,请检查导出的json及Excel\n"; } return(true); } else { errorString = "保存为json文件失败\n"; return(false); } }
public static bool ExportTableToJson(TableInfo tableInfo, out string errorString) { StringBuilder content = new StringBuilder(); // 生成数据内容开头 content.AppendLine("{"); // 当前缩进量 int currentLevel = 1; // 判断是否设置要将主键列的值作为导出的table中的元素 bool isAddKeyToJsonTable = tableInfo.TableConfig != null && tableInfo.TableConfig.ContainsKey(JsonStruct.CONFIG_NAME_ADD_KEY_TO_JSON_TABLE) && tableInfo.TableConfig[JsonStruct.CONFIG_NAME_ADD_KEY_TO_JSON_TABLE].Count > 0 && "true".Equals(tableInfo.TableConfig[JsonStruct.CONFIG_NAME_ADD_KEY_TO_JSON_TABLE][0], StringComparison.CurrentCultureIgnoreCase); // 逐行读取表格内容生成json table List <FieldInfo> allField = tableInfo.GetAllClientFieldInfo(); int dataCount = tableInfo.GetKeyColumnFieldInfo().Data.Count; for (int row = 0; row < dataCount; ++row) { // 将主键列作为key生成 content.Append(_GetJsonIndentation(currentLevel)); FieldInfo keyColumnField = allField[0]; if (keyColumnField.DataType == DataType.Int || keyColumnField.DataType == DataType.Long) { content.AppendFormat("\"{0}\":", keyColumnField.Data[row]); } // 注意:像“1_2”这样的字符串作为table的key必须加[""]否则json认为是语法错误 else if (keyColumnField.DataType == DataType.String) { content.AppendFormat("\"{0}\":", keyColumnField.Data[row]); } else { errorString = "用ExportTableTojson导出不支持的主键列数据类型"; AppLog.LogErrorAndExit(errorString); return(false); } content.AppendLine("{"); ++currentLevel; // 如果设置了要将主键列的值作为导出的table中的元素 if (isAddKeyToJsonTable == true) { content.Append(_GetJsonIndentation(currentLevel)); content.Append("\"").Append(keyColumnField.FieldName); content.Append("\":"); if (keyColumnField.DataType == DataType.Int || keyColumnField.DataType == DataType.Long) { content.Append(keyColumnField.Data[row]); } else if (keyColumnField.DataType == DataType.String) { content.AppendFormat("\"{0}\"", keyColumnField.Data[row]); } content.AppendLine(","); } // 将其他列依次作为value生成 for (int column = 1; column < allField.Count; ++column) { string oneFieldString = _GetOneField(allField[column], row, currentLevel, out errorString); if (errorString != null) { errorString = string.Format("导出表格{0}失败,", tableInfo.TableName) + errorString; return(false); } else { content.Append(oneFieldString); } } // 一行数据生成完毕后添加右括号结尾等 --currentLevel; content.Append(_GetJsonIndentation(currentLevel)); content.AppendLine("},"); } // 生成数据内容结尾 content.AppendLine("}"); string exportString = content.ToString(); //if (JsonStruct.IsNeedColumnInfo == true) // exportString = _GetColumnInfo(tableInfo) + exportString; // 保存为json文件 if (SaveJson.SaveJsonFile(tableInfo.TableName, tableInfo.TableName, exportString) == true) { errorString = null; return(true); } else { errorString = "保存为json文件失败\n"; return(false); } }