opt json-parse
This commit is contained in:
parent
0d73531bb1
commit
46bb3d9878
@ -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,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<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, '<').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, '<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(/("[^"]*")/g, '<span style="color: #a31515;">$1</span>');
|
||||
line = line.replace(/(")/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;">
|
||||
|
||||
Loading…
Reference in New Issue
Block a user