diff --git a/baogutang-admin/src/main/resources/templates/json-parse.html b/baogutang-admin/src/main/resources/templates/json-parse.html index 04e8067..1b58e18 100644 --- a/baogutang-admin/src/main/resources/templates/json-parse.html +++ b/baogutang-admin/src/main/resources/templates/json-parse.html @@ -75,6 +75,8 @@ + +
@@ -110,6 +112,8 @@ var shown_flag = false; var compress_flag = false; var xml_text; + var toJava_flag = false; + var deepParse_flag = false; $('.tip').tooltip(); function init() { @@ -117,13 +121,33 @@ zip_flag = false; shown_flag = false; compress_flag = false; + // toJava_flag 不在这里重置,由keyup事件单独处理 renderLine(); $('.xml').attr('style', 'color:#999;'); $('.zip').attr('style', 'color:#999;'); } $('#json-src').keyup(function () { - init(); + // 如果当前在Java模式,先退出 + if (toJava_flag) { + toJava_flag = false; + $('.toJava').attr('style', 'color:#999;'); + } + + // 如果当前在深度解析模式,先退出 + if (deepParse_flag) { + deepParse_flag = false; + $('.deepParse').attr('style', 'color:#999;'); + } + + // 重置其他标志位 + xml_flag = false; + zip_flag = false; + shown_flag = false; + compress_flag = false; + $('.xml').attr('style', 'color:#999;'); + $('.zip').attr('style', 'color:#999;'); + var content = $.trim($(this).val()); var result = ''; if (content != '') { @@ -339,6 +363,276 @@ message: '复制失败,请手动复制' }); }); + + // JSON转Java对象功能 + $('.toJava').click(function () { + if (toJava_flag) { + $('#json-src').keyup(); + } else { + if (!current_json) { + $.message && $.message({ + type: 'error', + message: '请先输入有效的JSON数据' + }); + return; + } + try { + var javaCode = json2Java(current_json, 'RootObject'); + var formattedCode = formatJavaCode(javaCode); + $('#json-target').html(formattedCode); + toJava_flag = true; + xml_flag = false; + zip_flag = false; + $(this).attr('style', 'color:#15b374;'); + } catch (e) { + $.message && $.message({ + type: 'error', + message: '转换失败:' + e.message + }); + } + } + }); + + // JSON转Java类的核心函数 + function json2Java(json, className) { + var classes = []; + var mainClass = generateJavaClass(json, className, classes); + + // 将主类放在最前面 + var result = mainClass; + + // 添加其他嵌套类 + if (classes.length > 0) { + result += '\n' + classes.join('\n'); + } + + return result; + } + + // 生成Java类代码 + function generateJavaClass(obj, className, classes) { + if (typeof obj !== 'object' || obj === null) { + return ''; + } + + var fields = []; + var imports = new Set(); + imports.add('import lombok.Data;'); + + if (Array.isArray(obj)) { + // 如果是数组,取第一个元素分析 + if (obj.length > 0) { + return generateJavaClass(obj[0], className, classes); + } + return ''; + } + + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + var value = obj[key]; + var fieldType = getJavaType(value, key, classes); + + // 处理字段名(驼峰命名) + var fieldName = toCamelCase(key); + + // 添加字段注释(如果原key和驼峰命名不同) + if (key !== fieldName) { + imports.add('import com.fasterxml.jackson.annotation.JsonProperty;'); + fields.push(' @JsonProperty("' + key + '")'); + } + + fields.push(' private ' + fieldType + ' ' + fieldName + ';'); + } + } + + var importStr = Array.from(imports).join('\n'); + var classCode = importStr + '\n\n'; + classCode += '@Data\n'; + classCode += 'public class ' + className + ' {\n'; + classCode += fields.join('\n'); + classCode += '\n}\n'; + + return classCode; + } + + // 获取Java类型 + function getJavaType(value, key, classes) { + if (value === null || value === undefined) { + return 'Object'; + } + + var type = typeof value; + + if (type === 'string') { + return 'String'; + } else if (type === 'number') { + return Number.isInteger(value) ? 'Integer' : 'Double'; + } else if (type === 'boolean') { + return 'Boolean'; + } else if (Array.isArray(value)) { + if (value.length === 0) { + return 'List'; + } + var firstElement = value[0]; + var elementType = getJavaType(firstElement, key, classes); + return 'List<' + elementType + '>'; + } else if (type === 'object') { + // 创建嵌套类 + var nestedClassName = capitalize(toCamelCase(key)); + var nestedClass = generateJavaClass(value, nestedClassName, classes); + if (nestedClass && !classes.includes(nestedClass)) { + classes.push(nestedClass); + } + return nestedClassName; + } + + return 'Object'; + } + + // 转换为驼峰命名 + function toCamelCase(str) { + return str.replace(/[_-](\w)/g, function(match, letter) { + return letter.toUpperCase(); + }).replace(/^[A-Z]/, function(match) { + return match.toLowerCase(); + }); + } + + // 首字母大写 + function capitalize(str) { + if (!str) return str; + return str.charAt(0).toUpperCase() + str.slice(1); + } + + // 深度解析JSON(递归解析转义的JSON字符串) + $('.deepParse').click(function () { + if (deepParse_flag) { + $('#json-src').keyup(); + } else { + if (!current_json) { + $.message && $.message({ + type: 'error', + message: '请先输入有效的JSON数据' + }); + return; + } + try { + var deepParsedJson = deepParseJson(current_json); + var result = new JSONFormat(JSON.stringify(deepParsedJson), 4).toString(); + $('#json-target').html(result); + + // 更新当前的json,以便其他功能使用 + current_json = deepParsedJson; + current_json_str = JSON.stringify(deepParsedJson); + + deepParse_flag = true; + xml_flag = false; + zip_flag = false; + toJava_flag = false; + $(this).attr('style', 'color:#15b374;'); + + $.message && $.message({ + type: 'success', + message: '深度解析完成' + }); + } catch (e) { + $.message && $.message({ + type: 'error', + message: '深度解析失败:' + e.message + }); + } + } + }); + + // 递归解析JSON字符串 + function deepParseJson(obj) { + if (obj === null || obj === undefined) { + return obj; + } + + if (typeof obj === 'string') { + // 尝试解析字符串,如果是JSON格式则递归解析 + try { + var trimmed = obj.trim(); + if ((trimmed.startsWith('{') && trimmed.endsWith('}')) || + (trimmed.startsWith('[') && trimmed.endsWith(']'))) { + var parsed = JSON.parse(trimmed); + return deepParseJson(parsed); + } + } catch (e) { + // 不是有效的JSON,返回原字符串 + } + return obj; + } + + if (Array.isArray(obj)) { + return obj.map(function(item) { + return deepParseJson(item); + }); + } + + if (typeof obj === 'object') { + var result = {}; + for (var key in obj) { + if (obj.hasOwnProperty(key)) { + result[key] = deepParseJson(obj[key]); + } + } + return result; + } + + return obj; + } + + // 格式化Java代码为HTML展示 + function formatJavaCode(code) { + var lines = code.split('\n'); + var html = '
'; + + lines.forEach(function(line, index) { + var formattedLine = highlightJavaCode(line); + html += '
'; + html += '' + (index + 1) + ''; + html += formattedLine; + html += '
'; + }); + + html += '
'; + return html; + } + + // Java代码语法高亮 + function highlightJavaCode(line) { + // 转义HTML特殊字符 + line = line.replace(//g, '>'); + + // 关键字高亮 (蓝色) + var keywords = ['public', 'private', 'protected', 'class', 'import', 'package', 'return', 'void', 'static', 'final', 'extends', 'implements']; + keywords.forEach(function(keyword) { + var regex = new RegExp('\\b' + keyword + '\\b', 'g'); + line = line.replace(regex, '' + keyword + ''); + }); + + // 注解高亮 (深绿色) + line = line.replace(/(@\w+)/g, '$1'); + + // 字符串高亮 (深红色) + line = line.replace(/("[^"]*")/g, '$1'); + line = line.replace(/(")/g, '"'); + + // 类型高亮 (青色) + var types = ['String', 'Integer', 'Long', 'Double', 'Float', 'Boolean', 'Object', 'List', 'Set', 'Map']; + types.forEach(function(type) { + var regex = new RegExp('\\b' + type + '\\b', 'g'); + line = line.replace(regex, '' + type + ''); + }); + + // 注释高亮 (灰绿色) + line = line.replace(/(\x2F\x2F.*$)/g, '$1'); + + return line; + } + $('#json-src').keyup();