由于项目中用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基础包。

Java代码 

1. /** 
2.      * 将对象封装成{@link JSONObject}对象,对象中的每个属性必须有get方法且符合JavaBean的命名标准。 
3.      * 目前不支持对象中有实现Collection接口类型的属性 
4.      *  
5.      * @author (Jessdy) 编写日期:May 9, 2008 
6.      *  
7.      * @param <T> 
8.      * @param t 
9.      *            需要转换成JSONObject的对象 
10.      * @return 
11.      */
12. public static
13. return ObjectToJSON(t, new String[] { ""
14.     }   
15.   
16. /** 
17.      * 将对象封装成{@link JSONObject}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 
18.      * 目前不支持对象中有实现Collection接口类型的属性,所以请把这种属性加入到filter中 
19.      *  
20.      * @author (Jessdy) 编写日期:May 9, 2008 
21.      *  
22.      * @param <T> 
23.      * @param t 
24.      *            需要转换成JSONObject的对象 
25.      * @param filters 
26.      *            被过滤的属性字符数组 
27.      * @return 
28.      */
29. public static
30. return ObjectToJSON(t, filters, false);   
31.     }   
32.        
33. /** 
34.      * 将对象封装成{@link JSONObject}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 
35.      *  
36.      * @author (Jessdy) 
37.      * 编写日期:Jul 23, 2008 
38.      * @author (Jessdy) 更新日期:Jul 25, 2008 更新内容:对于json输出值的过滤方法 
39.      *  
40.      * @param <T> 
41.      * @param t 需要转换成JSONObject的对象 
42.      * @param includes 被包含的属性字符数组 
43.      * @return 
44.      */
45. public static
46. return ObjectToJSON(t, includes, true);   
47.     }   
48.   
49. /** 
50.      * 将对象数组封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 
51.      *  
52.      * @author (Jessdy) 编写日期:May 9, 2008 
53.      *  
54.      * @param <T> 
55.      * @param ts 
56.      *            需要转换成JSONArray的对象数组 
57.      * @return 
58.      */
59. public static
60. new
61. for
62.             jsonArray.put(ObjectToJSON(t));   
63.         }   
64. return
65.     }   
66.   
67. /** 
68.      * 将对象数组封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 
69.      *  
70.      * @author (Jessdy) 编写日期:May 9, 2008 
71.      *  
72.      * @param <T> 
73.      * @param ts 
74.      *            需要转换成JSONArray的对象数组 
75.      * @param filters 
76.      *            被过滤的属性字符数组 
77.      * @return 
78.      */
79. public static
80. new
81. for
82.             jsonArray.put(ObjectToJSON(t, filters));   
83.         }   
84. return
85.     }   
86.        
87. /** 
88.      * 将对象数组封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 
89.      *  
90.      * @author (Jessdy) 编写日期:May 9, 2008 
91.      *  
92.      * @param <T> 
93.      * @param ts 
94.      *            需要转换成JSONArray的对象数组 
95.      * @param filters 
96.      *            被过滤的属性字符数组 
97.      * @return 
98.      */
99. public static
100. new
101. for
102.             jsonArray.put(IObjectToJSON(t, includes));   
103.         }   
104. return
105.     }   
106.   
107. /** 
108.      * 将对象数组封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 
109.      * 通过Annotation来封装JSONObject,JSONObject只包含带有{@link @Json}注释的属性 
110.      * 通过设置jsonName来改变JSONObject的keyName 
111.      *  
112.      * @author (Jessdy) 编写日期:May 9, 2008 
113.      *  
114.      * @param <T> 
115.      * @param ts 
116.      *            需要转换成JSONArray的对象数组 
117.      * @return 
118.      */
119. public static
120. new
121. for
122.             jsonArray.put(ObjectToJSONByAnnotation(t));   
123.         }   
124. return
125.     }   
126.   
127. /** 
128.      * 将对象队列封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 
129.      *  
130.      * @author (Jessdy) 编写日期:May 9, 2008 
131.      *  
132.      * @param <T> 
133.      * @param ts 
134.      *            需要转换成JSONArray的对象队列 
135.      * @return 
136.      */
137. public static
138. new
139. for
140.             jsonArray.put(ObjectToJSON(t));   
141.         }   
142. return
143.     }   
144.        
145. /** 
146.      * 将对象队列封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 
147.      *  
148.      * @author (Jessdy) 编写日期:May 9, 2008 
149.      *  
150.      * @param <T> 
151.      * @param ts 
152.      *            需要转换成JSONArray的对象队列 
153.      * @param filters 
154.      *            被过滤的属性字符数组 
155.      * @return 
156.      */
157. public static
158. new
159. for
160.             jsonArray.put(ObjectToJSON(t, filters));   
161.         }   
162. return
163.     }   
164.        
165. /** 
166.      * 将对象队列封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 
167.      *  
168.      * @author (Jessdy) 
169.      * 编写日期:Jul 23, 2008 
170.      *  
171.      * @param <T> 
172.      * @param ts 需要转换成JSONArray的对象队列 
173.      * @param includes 被包含的属性字符数组 
174.      * @return 
175.      */
176. public static
177. new
178. for
179.             jsonArray.put(IObjectToJSON(t, includes));   
180.         }   
181. return
182.     }   
183.        
184. /** 
185.      * 将对象队列封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 
186.      * 通过Annotation来封装JSONObject,JSONObject只包含带有{@link @Json}注释的属性 
187.      * 通过设置jsonName来改变JSONObject的keyName 
188.      *  
189.      * @author (Jessdy) 编写日期:May 9, 2008 
190.      *  
191.      * @param <T> 
192.      * @param ts 
193.      *            需要转换成JSONArray的对象队列 
194.      * @return 
195.      */
196. public static
197. new
198. for
199.             jsonArray.put(ObjectToJSONByAnnotation(t));   
200.         }   
201. return
202.     }   
203.   
204. /** 
205.      * 将Map集合封装成{@link JSONArray}对象,对象中的每个属性必须有<b>get</b>方法且符合<b>JavaBean</b>的命名标准。 
206.      * 通过Annotation来封装JSONObject,JSONObject只包含带有{@link @Json}注释的属性 
207.      * 通过设置jsonName来改变JSONObject的keyName 
208.      * @author (Jessdy) 
209.      * 编写日期:Jul 25, 2008 
210.      *  
211.      * @param <K> 键类型 
212.      * @param <T> 值类型 
213.      * @param ts 需要转换成JSONArray的Map 
214.      * @return 
215.      */
216. public static
217. new
218.         Iterator<K> keys = ts.keySet().iterator();   
219. while
220.             K key = keys.next();   
221.             jsonArray.put(ObjectToJSONByAnnotation(ts.get(key)));   
222.         }   
223. return
224.     }   
225.        
226. /** 
227.      *  
228.      * @author (Jessdy) 
229.      * 编写日期:Jul 25, 2008 
230.      *  
231.      * @param <K> 
232.      * @param <T> 
233.      * @param ts 
234.      * @return 
235.      */
236. public static
237. new
238.         Iterator<K> keys = ts.keySet().iterator();   
239. while
240.             K key = keys.next();   
241.             jsonArray.put(ObjectToJSON(ts.get(key), filters));   
242.         }   
243. return
244.     }   
245.   
246. /** 
247.      *  
248.      * @author (Jessdy) 
249.      * 编写日期:Jul 25, 2008 
250.      *  
251.      * @param <K> 
252.      * @param <T> 
253.      * @param ts 
254.      * @return 
255.      */
256. public static
257. new
258.         Iterator<K> keys = ts.keySet().iterator();   
259. while
260.             K key = keys.next();   
261.             jsonArray.put(IObjectToJSON(ts.get(key), includes));   
262.         }   
263. return
264.     }