前段时间闲来没事儿想做个网页游戏的外挂,后来用抓包工具抓到其数据为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>
}
项目源代码还在优化整理,等完善了再传附件
分享到:
相关推荐
在这个真实案例中,我们将深入探讨如何使用Gson库来解析复杂的JSON字符串。 Gson是Google提供的一个Java库,它能够将Java对象转换为JSON字符串,反之亦然。在解析复杂的JSON字符串时,Gson提供了强大的功能,包括对...
标题中的“提供将对象转换成JSON字符串的方法 (2).pdf”指的是一个关于如何在Java编程中将对象转换为JSON格式的文档。描述中提到的是这个文档的更新日期和作者信息。标签“互联网”可能暗示了这个方法在Web开发或者...
1. **解析JSON字符串**:工具首先需要解析输入的JSON字符串,将其解析成一个JSON对象结构。这通常通过JSON库来实现,如Jackson、Gson或Fastjson等。这些库提供了API,可以将JSON字符串转化为JSON对象或者JSON数组。 ...
首先,解析JSON字符串到`Map, Object>`,然后遍历这个映射,将键(属性名)转换为驼峰式,并创建对应的JavaBean实例,设置属性值。 5. **使用工具类或方法**:可以创建一个静态方法或者工具类,接收JSON字符串和...
这些工具在使用时,通常需要将JSON字符串或JSON文件作为输入,然后通过调用相应的API或运行脚本,即可生成对应的JavaBean源码,将其编译后导入项目,即可方便地进行数据的解析和封装。 在实际应用中,选择哪种工具...
- 该方法主要用于将 JavaBean 转换成 JSON 字符串。 - 首先初始化一个 `StringBuilder` 对象 `json` 并添加 `{`。 - 使用 `Introspector.getBeanInfo()` 获取传入对象的所有属性。 - 遍历所有属性,获取属性名和...
在处理请求时,如果JSON字符串为空,我们可以直接初始化`DiagResponeBean`对象并设置默认值,然后使用`ObjectMapper`将其转换为JSON字符串并写入响应输出流: ```java if (StringUtil.isEmpty(json)) { ...
Gson的`fromJson()`方法接收一个JSON字符串和目标类的Class对象,然后将JSON转换为对应的JavaBean实例。 除了Gson之外,其他的库如Jackson和Fastjson也有类似的API,但使用方法略有不同。例如,使用Jackson,我们...
反之,若要将JSON对象转换为JavaBean,可以使用`JSON.parseObject(jsonStr, BeanClass.class)`,这里`jsonStr`是JSON字符串,`BeanClass`是JavaBean的类。这个方法会根据JSON对象的键值对填充JavaBean的属性。 7. ...
1. **解析JSON数据**:工具能解析JSON字符串或JSON文件,提取其中的键值对,为每个键生成对应的Java属性。 2. **生成JavaBean代码**:基于解析出的键值对,工具会自动生成JavaBean的源代码,包括属性声明、getter和...
1. **自动解析JSON**: 工具能够解析JSON字符串或JSON文件,提取其中的键值对,然后根据这些键生成JavaBean的属性。 2. **自动生成getter/setter方法**: 生成的JavaBean不仅包含属性,还会有对应的getter和setter...
json2javabean是一个在线工具或库,它接受JSON字符串作为输入,然后生成对应的Java Bean类。这样,开发者可以快速将接收到的JSON数据映射到Java对象上,减少了手动创建Java类的时间。使用时,只需输入JSON字符串,...
本文将详细介绍如何利用Java反射机制来实现JavaBean对象到JSON字符串的转换,并提供具体的示例代码。 #### 二、Java反射机制简介 Java反射机制允许程序在运行时访问类的信息,包括字段、构造函数以及方法等。通过...
上述示例展示了如何将Java对象转换为JSON字符串,同样,也可以通过Gson或Jackson将JSON字符串转换回Java对象: ```java // 使用Gson反序列化 User user = gson.fromJson(json, User.class); // 使用Jackson反序列...
这个工具通常包含解析JSON字符串或文件的功能,并能根据JSON结构生成对应的Java源代码。这大大提高了开发效率,避免了手动编写JavaBean的繁琐工作。 在使用这个工具时,你需要首先安装Java Development Kit (JDK),...
同样,我们也可以将JSON字符串转换为JavaBean对象。首先,你需要定义一个与JSON结构对应的JavaBean类,然后使用Jackson的`ObjectMapper`进行转换: ```java public class User { private String name; private...
这类工具的主要功能是解析JSON字符串,并自动生成符合Java Bean规范的类,这样开发者就可以方便地将JSON数据映射到Java对象上,进行进一步的操作。通过输入JSON格式的数据,工具会自动分析其结构,包括键值对、数组...
在Java开发中,处理JSON数据时,我们经常需要将JSON字符串与Java对象之间进行相互转换,这正是"json转换插件"所扮演的角色。 这个插件的核心功能是提供了一个桥梁,连接JavaScript提交的JSON字符串和Java世界中的...
然后,我们可以通过Gson的fromJson方法将JSON字符串解析为JavaBean对象: ```java String jsonString = "{\"name\":\"张三\",\"age\":30,\"isStudent\":false,\"hobbies\":[\"读书\",\"跑步\",\"编程\"]}"; Gson ...
在给定的"javaBean.rar"压缩包中,包含两个核心文件——JavaBean.java和JavaUtil.java,它们可能是用于处理JSON字符串与Java实体类之间转换的工具类。 1. **JSON字符串与Java实体类的转换** JSON(JavaScript ...