前段时间闲来没事儿想做个网页游戏的外挂,后来用抓包工具抓到其数据为json字符串,但是其结构极为复杂且数据量庞大,要想对应写出其javabean文件会累死一堆人,于是我就考虑用freemarker的来替我完成这个工作,好了废话不多说,看代码:
JSONBeanUtil
package browser.json.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import browser.json.impl.BeanImpl;
import browser.json.impl.PropertyImpl;
import browser.json.itf.IProperty;
/**
*
* @param jsonString
* json字符串数据
* @param className
* 保存json数据的javabean的类名
* @param classPackage
* 保存json数据的javabean的包名
*/
public class JSONBeanUtil {
private String jsonString;
private String className;
private String classPackage;
public JSONBeanUtil(String jsonString, String className, String classPackage) {
this.jsonString = jsonString;
this.className = className;
this.classPackage = classPackage;
}
@SuppressWarnings("rawtypes")
public HashMap<String, Class> getJsonMap() throws ClassNotFoundException {
return this.putJsonMap(new HashMap<String, Class>(), this.jsonString,
this.className, this.classPackage);
}
public void writeJsonBean() {
this.writeJsonBean(this.jsonString, this.className, this.classPackage);
}
private void writeJsonBean(String strJson, String parentKey,
String packageStr) {
JSONObject jo = JSONObject.fromObject(strJson);
@SuppressWarnings("unchecked")
Set<Object> keySet = jo.keySet();
Object[] array = keySet.toArray();
BeanImpl bean = new BeanImpl();
List<IProperty> popatryList = new ArrayList<IProperty>();
List<String> importList = new ArrayList<String>();
IProperty popatry = (IProperty) new PropertyImpl();
for (Object key : array) {
String fieldName = key.toString();
popatry = (IProperty) new PropertyImpl();
String value = jo.getString(fieldName);
String firestUp = FreeMarkerUtil.firestUp(fieldName);
switch (getFlag(value)) {
case 1:
popatry.setFiledType("String");
break;
case 2:
popatry.setFiledType(firestUp);
importList.add(packageStr + "." + fieldName + "." + firestUp);
writeJsonBean(value, fieldName, packageStr + "." + fieldName);
break;
case 3:
String firestJsonArray = getFirestJsonArray(value);
if (firestJsonArray.equals("DO1")) {
popatry.setFiledType("List<String>");
} else {
writeJsonBean(firestJsonArray, fieldName, packageStr + "."
+ fieldName);
popatry.setFiledType("List<" + firestUp + ">");
importList.add(packageStr + "." + fieldName + "."
+ firestUp);
}
importList.add("java.util.List");
break;
}
popatry.setFiledName(FreeMarkerUtil.firestLow(fieldName));
popatry.setIoFunction(firestUp);
popatryList.add(popatry);
}
bean.setImportList(importList);
bean.setClassName(FreeMarkerUtil.firestUp(parentKey));
bean.setPackageName(packageStr);
bean.setPopatryList(popatryList);
FreeMarkerUtil.writeJavaBean(bean);
}
@SuppressWarnings("rawtypes")
private Class getClass(String path) throws ClassNotFoundException {
Class cl = Class.forName(path);
return cl;
}
private String getFirestJsonArray(String value) {
if (value.length() > 2) {
JSONArray ja = JSONArray.fromObject(value);
Object[] array = ja.toArray();
String string = array[0].toString();
if (string.length() > 2) {
String flag = string.substring(0, 1)
+ string.substring(string.length() - 1, string.length());
if (flag.equals("{}")) {
return string;
} else {
return "DO1";
}
} else {
return "DO1";
}
} else {
return "DO1";
}
}
private int getFlag(String value) {
if (value.length() > 1) {
String flag = value.substring(0, 1)
+ value.substring(value.length() - 1, value.length());
if (flag.equals("[]")) {
return 3;
}
if (flag.equals("{}")) {
return 2;
} else {
return 1;
}
} else {
return 1;
}
}
public String getJsonString() {
return jsonString;
}
public void setJsonString(String jsonString) {
this.jsonString = jsonString;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getClassPackage() {
return classPackage;
}
public void setClassPackage(String classPackage) {
this.classPackage = classPackage;
}
}
FreeMarkerUtil
package browser.json.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
import browser.json.itf.IBean;
import freemarker.template.Configuration;
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.Template;
import freemarker.template.TemplateException;
/**
*
* 模板工具类
*
* @author hailang
* @date 2009-7-9 上午10:21:25
* @version 1.0
*/
public class FreeMarkerUtil {
public static void writeJavaBean(IBean bean) {
Map<String, Object> root = new HashMap<String, Object>();
root.put("bean", bean);
FreeMarkerUtil.analysisTemplate("bean.ftl", "UTF-8", root);
}
/**
* @author hailang
* @date 2009-7-9 上午09:55:43
* @param templateName
* 模板文件名称
* @param root
* 数据模型根对象
* @param templateEncoding
* 模板文件的编码方式
*/
private static void analysisTemplate(String templateName,
String templateEncoding, Map<?, ?> root) {
try {
Configuration config = new Configuration();
File file = new File("src/templates");
config.setDirectoryForTemplateLoading(file);
config.setObjectWrapper(new DefaultObjectWrapper());
Template template = config.getTemplate(templateName,
templateEncoding);
Writer out = new OutputStreamWriter(new FileOutputStream(
pathStr(root)), templateEncoding);
template.process(root, out);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}
private static String pathStr(Map<?, ?> map) {
IBean bean = (IBean) map.get("bean");
String packageStr = "src/" + bean.getPackageName();
String className = firestUp(bean.getClassName());
if (className.length() > 5) {
if (className.substring(0, 5).equals("List<")) {
className = className.substring(5, className.length() - 1);
}
}
packageStr = packageStr.replace(".", "/");
createFile(packageStr);
return packageStr + "/" + className + ".java";
}
private static void createFile(String path) {
StringTokenizer st = new StringTokenizer(path, "/");
String path1 = st.nextToken() + "/";
String path2 = path1;
while (st.hasMoreTokens()) {
path1 = st.nextToken() + "/";
path2 += path1;
File inbox = new File(path2);
if (!inbox.exists())
inbox.mkdir();
}
}
public static String firestUp(String str) {
String upperCase = str.toUpperCase();
str = upperCase.substring(0, 1) + str.substring(1, str.length());
return str;
}
public static String firestLow(String str) {
String lowerCase = str.toLowerCase();
str = lowerCase.substring(0, 1) + str.substring(1, str.length());
return str;
}
}
IBean(结构容器)
package browser.json.itf;
import java.util.List;
public interface IBean {
public String getPackageName();
public void setPackageName(String packageName);
public String getClassName();
public void setClassName(String className);
public List<IProperty> getPopatryList();
public void setPopatryList(List<IProperty> popatryList);
public List<String> getImportList();
public void setImportList(List<String> importList);
}
package browser.json.itf;
public interface IProperty {
public String getFiledType();
public void setFiledType(String filedType);
public String getFiledName();
public void setFiledName(String filedName);
public String getIoFunction();
public void setIoFunction(String ioFunction);
}
ftl模板
package ${bean.packageName};
<#list bean.importList as string>
import ${string};
</#list>
public class ${bean.className} {
<#list bean.popatryList as popatry>
private ${popatry.filedType} ${popatry.filedName};
</#list>
public ${bean.className}() {
}
<#list bean.popatryList as popatry>
public ${popatry.filedType} get${popatry.ioFunction}() {
return this.${popatry.filedName};
}
public void set${popatry.ioFunction}(${popatry.filedType} ${popatry.filedName}) {
this.${popatry.filedName}=${popatry.filedName};
}
</#list>
}
项目源代码还在优化整理,等完善了再传附件
分享到:
相关推荐
MATLAB数字滤波器设计及其在语音信号去噪中的应用:源码详解与报告分享,MATLAB 数字滤波器设计 及其语音信号去噪应用。 (供学习交流)带源码,带注释。 有代码和报告。 ,核心关键词:MATLAB; 数字滤波器设计; 语音信号去噪应用; 源码; 注释; 代码与报告。,"MATLAB数字滤波器设计及其在语音信号去噪中的应用:带源码注释与报告"
COMSOL软件模拟三维电化学腐蚀过程的研究分析,comsol三维电化学腐蚀。 ,核心关键词:Comsol;三维电化学;腐蚀;模型模拟;电化学腐蚀过程。,"Comsol模拟:三维电化学腐蚀过程解析"
基于COMSOL的降雨入渗模型:边坡与渗流边界下的强度折减塑性形变研究,comsol降雨入渗模型,边坡降雨边界与渗流边界 强度折减塑性形变 ,comsol降雨入渗模型; 降雨边界; 渗流边界; 强度折减; 塑性形变,"COMSOL降雨入渗模型:边坡渗流与强度折减塑性形变分析"
2025员工安全意识培训试题及答案.docx
Python自动化办公源码-06在Word表格中将上下行相同内容的单元格自动合并
基于深度学习的神经网络技术在信息通信领域的应用研究.pdf
1.内容概要 通过KNN实现鸢尾花分类,即将新的数据点分配给已知类别中的某一类。该算法的核心思想是通过比较距离来确定最近邻的数据点,然后利用这些邻居的类别信息来决定待分类数据点的类别。 2.KNN算法的伪代码 对未知类别属性的数据集中的每个点依次执行以下操作: (1)计算已知类别数据集中的点与当前点之间的距离; (2)按照距离递增次序排序; (3)选取与当前点距离最小的k个点; (4)确定前k个点所在类别的出现频率; (5)返回前k个点出现频率最高的类别作为当前点的预测分类。 3.数据集说明 代码使用`pandas`库加载了一个名为`iris.arff.csv`的数据集 4.学习到的知识 通过鸢尾花分类学习了KNN算法,选择样本数据集中前k个最相似的数据,就是KNN算法中k的出处。k值过大,会出现分类结果模糊的情况;k值较小,那么预测的标签比较容易受到样本的影响。在实验过程中,不同的k值也会导致分类器的错误率不同。KNN算法精度高、无数据输入的假定,可以免去训练过程。但是对于数据量较多的训练样本,KNN必须保存全部数据集,可能会存在计算的时间复杂度、空间复杂度高的情况,存在维数灾难问
感应电机控制与矢量控制仿真:磁链闭环、转速闭环与电流闭环的综合应用研究,感应电机控制仿真,矢量控制,异步电机仿真,磁链闭环,转速闭环,电流闭环 ,核心关键词:感应电机控制仿真; 矢量控制; 异步电机仿真; 磁链闭环; 转速闭环; 电流闭环,"感应电机矢量控制仿真:磁链、转速、电流三闭环异步电机模拟"
威纶通TK6071IP触摸屏锁屏宏指令程序详解:注释清晰,便于理解与学习,威纶通触摸屏锁屏宏指令程序 ~ 威纶通触摸屏锁屏宏指令程序,TK6071IP触摸屏 利用宏指令程序来控制,宏指令注释清晰,方便理解程序。 具有很好的学习意义和借鉴价值。 ,关键词:威纶通触摸屏;锁屏宏指令程序;TK6071IP触摸屏;宏指令控制;注释清晰;学习借鉴。,威纶通触摸屏宏指令程序:清晰注释,学习借鉴之利器
2025输血相关法律法规试题考核试题及答案.docx
Python游戏编程源码-2048小游戏
2025最新康复医学概论考试题库(含答案).doc
Python自动化办公源码-09用Python批量往Word文档中指定位置添加图片
高品质车载充电器技术解决方案:含原理图、PCB图、C源代码及DSP控制器资料,附赠CDCDC模块资料,车载充电器 3Kw OBC 车载充电器 含原理图、PCB图、C源代码、变压器参数等生产资料。 附赠15kwdcdc模块资料 1、这款产品的方案采用的是dsp2803x系列。 2、原理图和Pcb采用AD绘制。 此方案仅供学习 ,车载充电器; 3Kw OBC; 原理图; PCB图; C源代码; 变压器参数; 生产资料; dsp2803x系列; AD绘制; 15kwdcdc模块资料,3Kw车载充电器方案:DSP2803x系列原理图、PCB图及C源学习包
2025最新康复医学考试题及答案.docx
内容概要:本文介绍了一种用于视频处理的新型卷积神经网络(CNN)加速器。主要创新点在于引入了混合精度计算、跨帧数据重用控制器及引擎,以及混合位宽差帧数据编码解码器。这些特性有效解决了视频帧间的时空相关性和稀疏性带来的挑战,提高了处理速度并降低了功耗和带宽需求。具体来说,通过对连续帧的数据相似度利用,可以在保持高精度的同时减少计算量和内存访问次数;通过多类型稀疏卷积聚类数组实现了对现代稀疏神经网络的支持;并通过混合位宽度编码减少了离芯片外的数据传输量,最高达到68%。 适用人群:从事深度学习硬件加速设计的研究人员和技术爱好者;关注AI边缘计算领域的从业者。 使用场景及目标:适用于自动驾驶汽车摄像头、监控系统等实时视频流应用场景。旨在为开发者提供高效的低能耗解决方案,在有限的时间和资源下完成大量的图像信号处理任务,如跟踪、分类等。 其他说明:文中还详细描述了芯片的设计细节,测试平台构建,以及不同模型(如MobileNet)在网络上的实际性能表现。
COMSOL电化学喷射腐蚀模拟与解析:技术原理及应用实践,comsol电化学喷射腐蚀 ,核心关键词:comsol; 电化学; 喷射腐蚀; 电化学腐蚀。,"电化学喷射腐蚀研究:comsol模拟与解析"
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat
直流无刷电机调速控制模型:速度环与电流环联合调控,PWM调制精确控制转速,该模型为直流无刷电机的调速控制,外环为速度环,速度输出为电流,内环为电流环,电流环输出为pwm占空比,占空比最终输入至逆变器进行PWM调制。 最后控制电机的转速 ,核心关键词:直流无刷电机; 调速控制; 外环速度环; 速度输出电流; 内环电流环; pwm占空比; 逆变器PWM调制; 控制电机转速。,直流无刷电机调速控制模型:内外环联动,PWM占空比驱动逆变器调速
基于MATLAB的含风光柴储微网多目标优化调度策略与模型实现,含风光柴储微网多目标优化调度 MATLAB代码 关键词:微网调度 风光柴储 粒子群算法 多目标优化 参考文档:《基于多目标粒子群算法的微电网优化调度》 仿真平台:MATLAB 平台采用粒子群实现求解 优势:代码注释详实,适合参考学习,非目前烂大街的版本,程序非常精品,请仔细辨识 主要内容:代码构建了含风机、光伏、柴油发电机以及储能电站在内的微网优化运行模型,并且考虑与上级电网的购电交易,综合考虑了多方经济成本以及风光新能源消纳等多方面的因素,从而实现微网系统的经济运行,求解采用的是MOPSO算法(多目标粒子群算法),求解效果极佳,具体可以看图 ,关键词:微网优化调度; 风光柴储; 粒子群算法; 多目标优化; MATLAB代码; MOPSO算法。,基于MATLAB的微网风光柴储多目标优化调度与MOPSO算法的实践研究