- 浏览: 62135 次
- 性别:
- 来自: 上海虹口区
-
文章分类
最新评论
-
xiemingfeng_:
执行token.signal()就会报以下的错误,是什么原因, ...
jBPM的学习(一) -
IT稻草人:
谢谢,很有用
JAVA基础 -
love_gaogang:
谢谢!我收益了!
JAVA基础 -
kxhu:
谢 谢 !
中文参数问题 -
星情泪:
public class Test {
publ ...
精辟的String与StringBuffer(StringBuilder)的区别
由于项目中用json作为ExtJS传到程序中的数据格式,所以许多地方需要将javaBean转换成为json,或者将list,map转换为json。所以写了一个工具类来做这个工作。实现方式分为两种:
1. 通过一个普通javabean,通过一些过滤字段,来生成json
private static <T> JSONObject ObjectToJSON(T t, String[] fields, boolean fieldKind){ Field[] fs = t.getClass().getDeclaredFields(); JSONObject jsonObject = new JSONObject(); for (Field field : fs) { String propertyName = field.getName(); for (String f : fields) { try { if (propertyName.equals(f) == fieldKind) { String methodName = "get" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1); Method m = t.getClass().getMethod(methodName); Object o = m.invoke(t); jsonObject.put(field.getName(), o instanceof String ? transHTML((String)o) : o); } else { continue; } } catch (SecurityException e) { throw new JSONUtilException(e); } catch (NoSuchMethodException e) { throw new JSONUtilException(e); } catch (IllegalArgumentException e) { throw new JSONUtilException(e); } catch (JSONException e) { throw new JSONUtilException(e); } catch (IllegalAccessException e) { throw new JSONUtilException(e); } catch (InvocationTargetException e) { throw new JSONUtilException(e); } } } return jsonObject; }
第一个参数是需要转换的bean,第二个参数为过滤字段,第三个参数是是否需要过滤的字段。也就是说,fieldKind为true时说明生成的json只包含第二个参数中的这些字段。如果fieldKind为false,生成json不包含这些字段
2. 通过在javabean类的属性上用annotation来表示是否需要生成到json中,并且通过可以通过在字段上设置children annotation来定义嵌套
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface Json { String jsonName() default ""; boolean children() default false; String childrenName() default "children"; }
/** * 将对象封装成{@link JSONObject}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 * 通过Annotation来封装JSONObject,JSONObject只包含带有{@link @Json}注释的属性 * 通过设置jsonName来改变JSONObject的keyName * 目前不支持对象中有实现Collection接口类型的属性,所以请不要把这种属性加上Annotation * * @author (Jessdy) 编写日期:May 9, 2008 * @author (Jessdy) 更新日期:May 23, 2008 更新内容:支持对于同类型的对象的父子层级关系 * @author (Jessdy) 更新日期:Jul 25, 2008 更新内容:对于json输出值的过滤方法 * * @param <T> * @param t * 需要转换成JSONObject的对象 * @return */ @SuppressWarnings("unchecked") public static <T> JSONObject ObjectToJSONByAnnotation(T t) { Field[] fields = t.getClass().getDeclaredFields(); JSONObject jsonObject = new JSONObject(); for (Field field : fields) { if (field.getAnnotations().length != 0 && field.getAnnotation(Json.class) != null) { try { String propertyName = field.getName(); String methodName = "get" + propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1); Method m = t.getClass().getMethod(methodName); if (!field.getAnnotation(Json.class).children()) { String keyName = notEmpty(field.getAnnotation( Json.class).jsonName()) ? field.getAnnotation( Json.class).jsonName() : field.getName(); Object o = m.invoke(t); jsonObject.put(keyName, o instanceof String ? transHTML((String)o) : o); } else { List<T> children = (List<T>) m.invoke(t); if (children == null) { children = new ArrayList<T>(); } JSONArray jsonArray = children == null ? null : new JSONArray(); for (T child : children) { JSONObject jsonChild = ObjectToJSONByAnnotation(child); jsonArray.put(jsonChild); } jsonObject.put(field.getAnnotation(Json.class) .childrenName(), jsonArray); } } catch (SecurityException e) { throw new JSONUtilException(e); } catch (NoSuchMethodException e) { throw new JSONUtilException(e); } catch (IllegalArgumentException e) { throw new JSONUtilException(e); } catch (JSONException e) { throw new JSONUtilException(e); } catch (IllegalAccessException e) { throw new JSONUtilException(e); } catch (InvocationTargetException e) { throw new JSONUtilException(e); } } } return jsonObject; }
以上就是主要代码,还有一个自定义的JSONUtilException。另外使用了jsonme.jar包作为json基础包。
/** * 将对象封装成{@link JSONObject}对象,对象中的每个属性必须有get方法且符合JavaBean的命名标准。 * 目前不支持对象中有实现Collection接口类型的属性 * * @author (Jessdy) 编写日期:May 9, 2008 * * @param <T> * @param t * 需要转换成JSONObject的对象 * @return */ public static <T> JSONObject ObjectToJSON(T t) { return ObjectToJSON(t, new String[] { "" }); } /** * 将对象封装成{@link JSONObject}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 * 目前不支持对象中有实现Collection接口类型的属性,所以请把这种属性加入到filter中 * * @author (Jessdy) 编写日期:May 9, 2008 * * @param <T> * @param t * 需要转换成JSONObject的对象 * @param filters * 被过滤的属性字符数组 * @return */ public static <T> JSONObject ObjectToJSON(T t, String[] filters) { return ObjectToJSON(t, filters, false); } /** * 将对象封装成{@link JSONObject}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 * * @author (Jessdy) * 编写日期:Jul 23, 2008 * @author (Jessdy) 更新日期:Jul 25, 2008 更新内容:对于json输出值的过滤方法 * * @param <T> * @param t 需要转换成JSONObject的对象 * @param includes 被包含的属性字符数组 * @return */ public static <T> JSONObject IObjectToJSON(T t, String[] includes){ return ObjectToJSON(t, includes, true); } /** * 将对象数组封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 * * @author (Jessdy) 编写日期:May 9, 2008 * * @param <T> * @param ts * 需要转换成JSONArray的对象数组 * @return */ public static <T> JSONArray ArrayToJSON(T[] ts) { JSONArray jsonArray = new JSONArray(); for (T t : ts) { jsonArray.put(ObjectToJSON(t)); } return jsonArray; } /** * 将对象数组封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 * * @author (Jessdy) 编写日期:May 9, 2008 * * @param <T> * @param ts * 需要转换成JSONArray的对象数组 * @param filters * 被过滤的属性字符数组 * @return */ public static <T> JSONArray ArrayToJSON(T[] ts, String[] filters) { JSONArray jsonArray = new JSONArray(); for (T t : ts) { jsonArray.put(ObjectToJSON(t, filters)); } return jsonArray; } /** * 将对象数组封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 * * @author (Jessdy) 编写日期:May 9, 2008 * * @param <T> * @param ts * 需要转换成JSONArray的对象数组 * @param filters * 被过滤的属性字符数组 * @return */ public static <T> JSONArray IArrayToJSON(T[] ts, String[] includes) { JSONArray jsonArray = new JSONArray(); for (T t : ts) { jsonArray.put(IObjectToJSON(t, includes)); } return jsonArray; } /** * 将对象数组封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 * 通过Annotation来封装JSONObject,JSONObject只包含带有{@link @Json}注释的属性 * 通过设置jsonName来改变JSONObject的keyName * * @author (Jessdy) 编写日期:May 9, 2008 * * @param <T> * @param ts * 需要转换成JSONArray的对象数组 * @return */ public static <T> JSONArray ArrayToJSONByAnnotation(T[] ts) { JSONArray jsonArray = new JSONArray(); for (T t : ts) { jsonArray.put(ObjectToJSONByAnnotation(t)); } return jsonArray; } /** * 将对象队列封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 * * @author (Jessdy) 编写日期:May 9, 2008 * * @param <T> * @param ts * 需要转换成JSONArray的对象队列 * @return */ public static <T> JSONArray ArrayToJSON(List<T> ts) { JSONArray jsonArray = new JSONArray(); for (T t : ts) { jsonArray.put(ObjectToJSON(t)); } return jsonArray; } /** * 将对象队列封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 * * @author (Jessdy) 编写日期:May 9, 2008 * * @param <T> * @param ts * 需要转换成JSONArray的对象队列 * @param filters * 被过滤的属性字符数组 * @return */ public static <T> JSONArray ArrayToJSON(List<T> ts, String[] filters) { JSONArray jsonArray = new JSONArray(); for (T t : ts) { jsonArray.put(ObjectToJSON(t, filters)); } return jsonArray; } /** * 将对象队列封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 * * @author (Jessdy) * 编写日期:Jul 23, 2008 * * @param <T> * @param ts 需要转换成JSONArray的对象队列 * @param includes 被包含的属性字符数组 * @return */ public static <T> JSONArray IArrayToJSON(List<T> ts, String[] includes) { JSONArray jsonArray = new JSONArray(); for (T t : ts) { jsonArray.put(IObjectToJSON(t, includes)); } return jsonArray; } /** * 将对象队列封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 * 通过Annotation来封装JSONObject,JSONObject只包含带有{@link @Json}注释的属性 * 通过设置jsonName来改变JSONObject的keyName * * @author (Jessdy) 编写日期:May 9, 2008 * * @param <T> * @param ts * 需要转换成JSONArray的对象队列 * @return */ public static <T> JSONArray ArrayToJSONByAnnotation(List<T> ts) { JSONArray jsonArray = new JSONArray(); for (T t : ts) { jsonArray.put(ObjectToJSONByAnnotation(t)); } return jsonArray; } /** * 将Map集合封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 * 通过Annotation来封装JSONObject,JSONObject只包含带有{@link @Json}注释的属性 * 通过设置jsonName来改变JSONObject的keyName * @author (Jessdy) * 编写日期:Jul 25, 2008 * * @param <K> 键类型 * @param <T> 值类型 * @param ts 需要转换成JSONArray的Map * @return */ public static <K, T> JSONArray MapToJSONByAnnotation(Map<K, T> ts) { JSONArray jsonArray = new JSONArray(); Iterator<K> keys = ts.keySet().iterator(); while (keys.hasNext()) { K key = keys.next(); jsonArray.put(ObjectToJSONByAnnotation(ts.get(key))); } return jsonArray; } /** * * @author (Jessdy) * 编写日期:Jul 25, 2008 * * @param <K> * @param <T> * @param ts * @return */ public static <K, T> JSONArray MapToJSON(Map<K, T> ts, String[] filters) { JSONArray jsonArray = new JSONArray(); Iterator<K> keys = ts.keySet().iterator(); while (keys.hasNext()) { K key = keys.next(); jsonArray.put(ObjectToJSON(ts.get(key), filters)); } return jsonArray; } /** * * @author (Jessdy) * 编写日期:Jul 25, 2008 * * @param <K> * @param <T> * @param ts * @return */ public static <K, T> JSONArray IMapToJSON(Map<K, T> ts, String[] includes) { JSONArray jsonArray = new JSONArray(); Iterator<K> keys = ts.keySet().iterator(); while (keys.hasNext()) { K key = keys.next(); jsonArray.put(IObjectToJSON(ts.get(key), includes)); } return jsonArray; }
- Json.rar (3 KB)
- 下载次数: 42
- jsonme.jar (148.2 KB)
- 下载次数: 36
发表评论
-
在JEE环境下整合Activiti5.8
2011-11-22 16:42 5218Activiti5的前身是jBPM4,而jBPM5是由D ... -
Java设计模式——Adapter 适配器模式(1)
2011-01-27 23:29 1173写在前面:在四人帮提出的23种设计模式中,每一种设计模式实际上 ... -
IBM Websphere 内存溢出一例
2010-05-18 18:28 2745[10-5-18 16:08:43:855 CST] 0 ... -
java的Integer比较果然很妖
2008-03-20 10:53 5133首先:public static void main(Stri ... -
精辟的String与StringBuffer(StringBuilder)的区别
2007-11-21 16:34 2450今天有空,下了scjp的题 ... -
static关键字
2007-01-28 12:57 1427当声明一个事物是static时,就意味着这个数据或方法不会与包 ... -
Java中存储数据的地方及Java的基本类型
2007-01-28 12:01 1967在Java程序运行时有6个地方可以存储数据: 寄存 ... -
面向对象基础(OOP)
2007-01-27 22:46 1483OOP:Object Oriented Programming ... -
JAVA基础
2007-01-27 20:05 2217JAVA的应用可分为三个方面: JAVA桌面软件应用 ...
相关推荐
在Java编程中,将普通类转换为JSON对象是一种常见的需求,特别是在处理Web服务或数据交换时。这个场景中提到的是将一个Java类编译成JSON,但只包含那些具有getter和setter方法的属性。这样的转换有助于减少JSON输出...
JSON转EXCEL文件离线安装包是一个专为C# WinForm平台设计的应用程序,它能够方便地将JSON数据转换成Excel格式,以便于数据分析、报表生成或者数据存储。这个安装包包含了所有必要的组件,用户无需在线下载多个依赖库...
`Obj2StrUtil` 是一个Java工具类,它的主要功能是将Java对象转换成JSON格式的字符串。这个类主要处理了四种类型的对象:Map、List、数组以及普通的Java Bean对象。以下是这个类的具体解析: 1. **处理Map对象** `...
3. **commons-lang-2.3.jar**:Apache Commons Lang是Java标准类库的补充,包含了一些实用的工具类,可能在数据转换过程中提供辅助功能。 4. **commons-beanutils-1.7.0.jar**:Apache Commons BeanUtils简化了...