自制java一个json字符串生产,虽然有很多bug,还是分享一下
2013-10-05 00:00
567 查看
摘要: 由于,使用org.json包,在使用hibernate 利用 annotation 注释一个实体类,但是对应一对多的时候,利用JSONObject生成json字符串报错,于是,就弄了一个自己方便的json生产串
package web.test.util; import java.lang.reflect.Field; import java.lang.reflect.Method; import web.test.model.User; public class JsonObject { // 存储对象 Object object; // 获取类对象 private Class<?> clazz; // 获取类的Field private Field[] fields = null; // 设置过滤的属性类型 private String[] excludeField = null; // 过滤的属性个数 private int excludeNumber; // 无参构造方法 public JsonObject() { } //对象构造 public JsonObject(Object obj) throws Exception { object = obj; clazz = obj.getClass(); fields = clazz.getDeclaredFields(); excludeField = new String[fields.length]; excludeNumber = 0; } /** * 给类附加对象 * * @param obj */ public void setClassObject(Object obj) throws Exception { object = obj; clazz = obj.getClass(); fields = clazz.getDeclaredFields(); excludeField = new String[fields.length]; excludeNumber = 0; } /** * 设置过滤的属性 * * @param fieldType */ public void setExcludeField(String fieldType) { try { if (fieldType.equals("int") || fieldType.equals("Integer")) { excludeField[excludeNumber++] = "INT"; } else if (fieldType.equals("String")) { excludeField[excludeNumber++] = "STRING"; } else if (fieldType.equals("Set") || fieldType.equals("HashSet")) { excludeField[excludeNumber++] = "SET"; } else if (fieldType.equals("List") || fieldType.equals("ArrayList")) { excludeField[excludeNumber++] = "LIST"; } else if (fieldType.equals("long") || fieldType.equals("Long")) { excludeField[excludeNumber++] = "LONG"; } else if (fieldType.equals("float") || fieldType.equals("Float")) { excludeField[excludeNumber++] = "FLOAT"; } else if (fieldType.equals("double") || fieldType.equals("Double")) { excludeField[excludeNumber++] = "DOUBLE"; } } catch (Exception e) { new Exception("超过了排除列表,至少留一个属性"); } } /** * 对应对象构造方法 * @return * @throws Exception */ public String getJsonString() throws Exception { return getJson(clazz, object); } /** * 对应无参构造方法 * @param obj * @return * @throws Exception */ public String getJsonString(Object obj) throws Exception { Class<?> clazz = obj.getClass(); return getJson(clazz, obj); } /** * 递归获取数据 * @param clazz * @param obj * @return * @throws Exception */ public String getJson(Class<?> clazz,Object obj)throws Exception{ Field[] fields = clazz.getDeclaredFields(); StringBuffer sb = new StringBuffer(); sb.append("{"); for (int i = 1; i < fields.length; i++) { boolean flag = true; for (int j = 0; j < excludeField.length; j++) { if (excludeField[j] == null) break; if (fields[i].getType().toString().toUpperCase().indexOf( excludeField[j]) != -1) { flag = false; break; } } if (flag == false) continue; String temp = "get" + fields[i].getName().substring(0, 1).toUpperCase() + fields[i].getName().substring(1); Method m = clazz.getMethod(temp, new Class[] {}); Object value = m.invoke(obj, new Object[] {}); String type 3ff0 = fields[i].getType().toString().toUpperCase() ; if (type.indexOf("INT") != -1||type.indexOf("FLOAT")!=-1||type.indexOf("DOUBLE")!=-1) { sb.append("\"" + fields[i].getName() + "\":"+value+","); }else if(type.indexOf("STRING")!=-1){ sb.append("\""+fields[i].getName()+"\":\""+value+"\",") ; }else{ //判断是否还有实体类 if(type.indexOf("CLASS")!=-1){ sb.append("\""+fields[i].getName()+"\":"+getJsonString(value)+",") ; } } } return sb.toString().substring(0, sb.length()-1)+"}"; } /** * 测试方法 * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { User user = new User(); user.setId(1); user.setSuser(null); user.setAge(21); user.setName("legal"); user.setPass("123456"); user.setSex("femal"); user.setRuser(null); JsonObject json = new JsonObject(user); json.setExcludeField("Set"); System.out.println(json.getJsonString()); } }欢迎各位指出一些bug,谢谢
相关文章推荐
- Java Swing 组件居中显示
- Java Swing JTable失去焦点前提交
- Spring3整合Hibernate4 Lorg/hibernate/cache/CacheProvider异常
- 阔别一年,重新拾起java(线程回顾第一篇)
- Java getClass() , getName() , Class.forName() 详解
- java集合类总结
- Struts2常用标签之通用标签的使用
- JNI--Java中调用DLL
- Java SE——多态
- Myeclipse安装SVN插件
- java环境的配置,及jdk环境变量文件夹lib中的rt.jar ,dt.jar ,tool.jar作用
- 2014 IGT 软件测试开发工程师笔试(java-B1版)
- Java中的Heap和Stack
- Java Web中使用数据库连接池proxool配置详解
- java基础入门----Date对象
- java基础入门-----Runtime对象
- java基础入门-----System对象
- java基础入门-----静态导入
- java基础入门-----可变参数
- java基础入门----- 高级for循环2