Example #1
0
    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);
        }
    }
Example #3
0
    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);
        }
    }