Compare commits

...

2 Commits

Author SHA1 Message Date
N1KO
0f0d7330ca opt json-parse 2025-12-19 10:44:00 +08:00
N1KO
46bb3d9878 opt json-parse 2025-12-19 10:39:56 +08:00

View File

@ -66,7 +66,7 @@
<div class="col-md-7" style="padding:0;">
<div style="padding:10px;font-size:16px;border-bottom:solid 1px #ddd;" class="navi">
<a href="#" class="tip zip" title="压缩" data-placement="bottom"><i class="fa fa-database"></i></a>
<a href="#" class="tip zipCopy" title="压缩并复制" data-placement="bottom"><i class="fa fa-files-o"></i></a>
<a href="#" class="tip zipCopy" title="压缩并复制" data-placement="bottom"><i class="fa fa-clipboard"></i></a>
<a href="#" class="tip xml" title="转XML" data-placement="bottom"><i class="fa fa-file-excel-o"></i></a>
<a href="#" class="tip shown" title="显示行号" data-placement="bottom"><i
class="glyphicon glyphicon-sort-by-order"></i></a>
@ -75,6 +75,8 @@
<a href="#" class="tip copy" title="复制" data-clipboard-target="#json-target" data-placement="bottom"><i
class="fa fa-copy"></i></a>
<a href="#" class="tip compress" title="折叠" data-placement="bottom"><i class="fa fa-compress"></i></a>
<a href="#" class="tip toJava" title="转Java对象" data-placement="bottom"><i class="fa fa-code"></i></a>
<a href="#" class="tip deepParse" title="去除转译" data-placement="bottom"><i class="fa fa-sitemap"></i></a>
</div>
<div id="right-box"
style="height:1100px;border-right:solid 1px #ddd;border-bottom:solid 1px #ddd;border-radius:0;resize: none;overflow-y:scroll; outline:none;position:relative;">
@ -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,10 +363,280 @@
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<Object>';
}
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 = '<div style="padding: 10px; font-family: \'Consolas\', \'Monaco\', \'Courier New\', monospace; font-size: 14px; line-height: 1.6; background-color: #f8f8f8;">';
lines.forEach(function(line, index) {
var formattedLine = highlightJavaCode(line);
html += '<div style="padding: 2px 0;">';
html += '<span style="color: #999; margin-right: 15px; user-select: none;">' + (index + 1) + '</span>';
html += formattedLine;
html += '</div>';
});
html += '</div>';
return html;
}
// Java代码语法高亮
function highlightJavaCode(line) {
// 转义HTML特殊字符
line = line.replace(/</g, '&lt;').replace(/>/g, '&gt;');
// 关键字高亮 (蓝色)
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, '<span style="color: #0000ff; font-weight: bold;">' + keyword + '</span>');
});
// 注解高亮 (深绿色)
line = line.replace(/(@\w+)/g, '<span style="color: #808000; font-weight: bold;">$1</span>');
// 字符串高亮 (深红色)
line = line.replace(/(&quot;[^&quot;]*&quot;)/g, '<span style="color: #a31515;">$1</span>');
line = line.replace(/(&quot;)/g, '<span style="color: #a31515;">"</span>');
// 类型高亮 (青色)
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, '<span style="color: #2b91af; font-weight: bold;">' + type + '</span>');
});
// 注释高亮 (灰绿色)
line = line.replace(/(\x2F\x2F.*$)/g, '<span style="color: #008000; font-style: italic;">$1</span>');
return line;
}
$('#json-src').keyup();
</script>
<footer style="padding:30px;text-align:center;font-family:'JetBrains Mono NL', Monaco, monospace;position:relative;">
Copyright © 2024 <a
Copyright © 2026 <a
href="http://beian.miit.gov.cn">皖ICP备2024050571号</a>All Rights Reserved.
<p></p>
</footer>