`
dydytd3400
  • 浏览: 22953 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

将json字符串直接生成为对应结构的javabean文件

阅读更多
前段时间闲来没事儿想做个网页游戏的外挂,后来用抓包工具抓到其数据为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>
}


项目源代码还在优化整理,等完善了再传附件
分享到:
评论
1 楼 lzb821 2014-11-16  
不知道楼主这个代码优化好了没,文章中的代码不全

相关推荐

    复杂的json字符串解析(真实案例)

    在这个真实案例中,我们将深入探讨如何使用Gson库来解析复杂的JSON字符串。 Gson是Google提供的一个Java库,它能够将Java对象转换为JSON字符串,反之亦然。在解析复杂的JSON字符串时,Gson提供了强大的功能,包括对...

    提供将对象转换成JSON字符串的方法 (2).pdf

    标题中的“提供将对象转换成JSON字符串的方法 (2).pdf”指的是一个关于如何在Java编程中将对象转换为JSON格式的文档。描述中提到的是这个文档的更新日期和作者信息。标签“互联网”可能暗示了这个方法在Web开发或者...

    Json一键转Javabean工具

    1. **解析JSON字符串**:工具首先需要解析输入的JSON字符串,将其解析成一个JSON对象结构。这通常通过JSON库来实现,如Jackson、Gson或Fastjson等。这些库提供了API,可以将JSON字符串转化为JSON对象或者JSON数组。 ...

    首字母大写的json串转为javabean实例

    首先,解析JSON字符串到`Map, Object&gt;`,然后遍历这个映射,将键(属性名)转换为驼峰式,并创建对应的JavaBean实例,设置属性值。 5. **使用工具类或方法**:可以创建一个静态方法或者工具类,接收JSON字符串和...

    json自动生成javabean的工具jar

    这些工具在使用时,通常需要将JSON字符串或JSON文件作为输入,然后通过调用相应的API或运行脚本,即可生成对应的JavaBean源码,将其编译后导入项目,即可方便地进行数据的解析和封装。 在实际应用中,选择哪种工具...

    ajax json java 用法 json 将List、Object转换为Json格式字符串

    - 该方法主要用于将 JavaBean 转换成 JSON 字符串。 - 首先初始化一个 `StringBuilder` 对象 `json` 并添加 `{`。 - 使用 `Introspector.getBeanInfo()` 获取传入对象的所有属性。 - 遍历所有属性,获取属性名和...

    Javabean转换成json字符并首字母大写代码实例

    在处理请求时,如果JSON字符串为空,我们可以直接初始化`DiagResponeBean`对象并设置默认值,然后使用`ObjectMapper`将其转换为JSON字符串并写入响应输出流: ```java if (StringUtil.isEmpty(json)) { ...

    javabean和json转换_javabean2json_

    Gson的`fromJson()`方法接收一个JSON字符串和目标类的Class对象,然后将JSON转换为对应的JavaBean实例。 除了Gson之外,其他的库如Jackson和Fastjson也有类似的API,但使用方法略有不同。例如,使用Jackson,我们...

    FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换操作

    反之,若要将JSON对象转换为JavaBean,可以使用`JSON.parseObject(jsonStr, BeanClass.class)`,这里`jsonStr`是JSON字符串,`BeanClass`是JavaBean的类。这个方法会根据JSON对象的键值对填充JavaBean的属性。 7. ...

    json一键生成javabean工具

    1. **解析JSON数据**:工具能解析JSON字符串或JSON文件,提取其中的键值对,为每个键生成对应的Java属性。 2. **生成JavaBean代码**:基于解析出的键值对,工具会自动生成JavaBean的源代码,包括属性声明、getter和...

    json一键转javabean工具

    1. **自动解析JSON**: 工具能够解析JSON字符串或JSON文件,提取其中的键值对,然后根据这些键生成JavaBean的属性。 2. **自动生成getter/setter方法**: 生成的JavaBean不仅包含属性,还会有对应的getter和setter...

    json2javabean josnschema2pojo

    json2javabean是一个在线工具或库,它接受JSON字符串作为输入,然后生成对应的Java Bean类。这样,开发者可以快速将接收到的JSON数据映射到Java对象上,减少了手动创建Java类的时间。使用时,只需输入JSON字符串,...

    java反射实现javabean转json实例代码.docx

    本文将详细介绍如何利用Java反射机制来实现JavaBean对象到JSON字符串的转换,并提供具体的示例代码。 #### 二、Java反射机制简介 Java反射机制允许程序在运行时访问类的信息,包括字段、构造函数以及方法等。通过...

    JSON入门Java篇-5-用JavaBean来构建JSON.rar

    上述示例展示了如何将Java对象转换为JSON字符串,同样,也可以通过Gson或Jackson将JSON字符串转换回Java对象: ```java // 使用Gson反序列化 User user = gson.fromJson(json, User.class); // 使用Jackson反序列...

    json自动生成javabean_JavaEnityTools.jar.rar

    这个工具通常包含解析JSON字符串或文件的功能,并能根据JSON结构生成对应的Java源代码。这大大提高了开发效率,避免了手动编写JavaBean的繁琐工作。 在使用这个工具时,你需要首先安装Java Development Kit (JDK),...

    json转Map,转javaBean,javBean和Map转json

    同样,我们也可以将JSON字符串转换为JavaBean对象。首先,你需要定义一个与JSON结构对应的JavaBean类,然后使用Jackson的`ObjectMapper`进行转换: ```java public class User { private String name; private...

    根据json串自动生成JAVA BEAN工具

    这类工具的主要功能是解析JSON字符串,并自动生成符合Java Bean规范的类,这样开发者就可以方便地将JSON数据映射到Java对象上,进行进一步的操作。通过输入JSON格式的数据,工具会自动分析其结构,包括键值对、数组...

    json转换插件

    在Java开发中,处理JSON数据时,我们经常需要将JSON字符串与Java对象之间进行相互转换,这正是"json转换插件"所扮演的角色。 这个插件的核心功能是提供了一个桥梁,连接JavaScript提交的JSON字符串和Java世界中的...

    Android解析——json解析为javabean

    然后,我们可以通过Gson的fromJson方法将JSON字符串解析为JavaBean对象: ```java String jsonString = "{\"name\":\"张三\",\"age\":30,\"isStudent\":false,\"hobbies\":[\"读书\",\"跑步\",\"编程\"]}"; Gson ...

    javaBean.rar

    在给定的"javaBean.rar"压缩包中,包含两个核心文件——JavaBean.java和JavaUtil.java,它们可能是用于处理JSON字符串与Java实体类之间转换的工具类。 1. **JSON字符串与Java实体类的转换** JSON(JavaScript ...

Global site tag (gtag.js) - Google Analytics