`
jessdy
  • 浏览: 60254 次
  • 性别: Icon_minigender_1
  • 来自: 上海虹口区
社区版块
存档分类
最新评论

发个普通类转成json的工具类,功能比较简单

    博客分类:
  • Java
阅读更多

由于项目中用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;
	}
 
2
1
分享到:
评论

相关推荐

    阿里巴巴快速JSON工具

    阿里巴巴快速JSON工具,速度快使用简单,可以对集合和普通对象完成快速类型转换

    解析json工具

    这个是详细的json工具,里面将json的解析分为四大类,分别是普通json字段,json嵌套json,json数组,转义字符json

    json转换工具类

    1.FastJson速度快,无论序列化和反序列化,都是当之无愧的fast; 2.功能强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、Date或enum); 3.零依赖(没有依赖其它任何类库)。

    AnyFo - Util - Json4Ext:通用ExtJS数据交换处理

    在Json4Ext中,目前提供了生成以下几种格式的Json数据的工具类: 1. ExtJS中普通消息类型的Json字符串 2. ExtJS中的Grid控件需要的Json字符串 3. ExtJS中常用的数组类型的Json字符串 4. ExtJS中的Tree控件需要的...

    Java的JSON处理器 fastjson-v2

    fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器 主要特点: 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson) 强大(支持普通JDK类包括任意Java Bean Class、Collection、Map、...

    json工具fastjson-master by java

    fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。 主要特点: 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson) 强大(支持普通JDK类包括任意Java...

    JSON-to-POJO:使用此工具,您可以轻松地将JSON转换为POJO(普通的旧Java对象)

    JSON到POJO 网络版 原料药 用所需的json正文发布到/ json / {root},内容类型为text / plain。 其中root是根类的名称。 例子: POST http: //app-leaderboards.rhcloud.com/parser/json/MyClass HTTP/1.1 Host: ...

    json数据相关jar包

    软件开发的朋友有时会用到json数据的传输,json数据与普通数据之间的转换,有时会出现工具类找不到的错误!jar包问题,现提供最新json相关jar包下载!

    JSONFormat4Flutter:受zzz40500GsonFormat启发,将JSONObject格式的字符串解析成dart语言的实体类

    受zzz40500 / GsonFormat启发,将JSONObject格式的字符串解析成dart语言的实体类 详细介绍说明(掘金): 使用演示操作: 使用说明 1.界面操作(参考录屏: ) 工具运行以后,先将复制好的json字符串插入到文本框,...

    C#基类库(苏飞版)

    List转成Json|对象转成Json|集合转成Json|DataSet转成Json|DataTable转成Json|DataReader转成Json等 8.Mime MediaTypes 电子邮件类型帮助类,规定是以Xml,HTML还是文本方式发送邮件 MimeEntity Mime实体帮助类...

    HttpsClientUtil

    HTTPS工具类,只需要修改URL和参数即可,同时,附加普通的http POST方法,JSON格式

    mnt-base开发工具包及源代码

    1. 基于Jetty的Restful ws框架,支持普通方式和注解方式,快速封装web service服务. 2. 基于mina的stream、xml数据格式的tcp通信服务和客户端的框架。 3. JSON数据解析。 4. JDBC封装(DAS) 5. 常用的工具。 包含源...

    yast:另一个调查工具

    Yast - 另一个调查工具评估,游乐场项目尝试实施一页应用程序能力调查。 参考前端是使用 BackboneJS 实现的,普通参考后端是使用利用 ExpressJs 4 的 NodeJS 服务器实现的。主意用于反馈和调查的 REST API 调查模板...

    DataX Web分布式数据同步工具-其他

    DataX Web是在DataX之上开发的分布式数据同步工具,提供简单易用的操作界面,降低用户使用DataX的学习成本,缩短任务配置时间,避免配置过程中出错。用户可通过页面选择数据源即可创建数据同步任务,RDBMS数据源可...

    Java后端HttpClient Post提交文件流 及服务端接收文件流

    HttpClient Post提交多文件及多个普通参数,已经封装成工具类。 需传入 要请求的url 普通参数map 例 map.put("param1","张三"); 需要传入的文件流map 其中key为文件名 服务端接收无乱码。

    程序员5个刷题网站-API-Inspector:一个辅助嗅探页面API接口的工具

    于是就有个问题,这么多人有这样的需求,那么它是不是应该变得更简单一些? 以往我们扒接口的流程是什么? 打开审查工具 打开网络选项卡 刷新页面 调整过滤器到只看 xhr 逐个点击列表里的请求,查看返回数据是否是 ...

    老罗android视频开发源码和ppt经典

    4.4 http使用apache工具类提交数据 五、 Android解析json数据 5.1 android解析json数据(一) 5.2 android解析json数据(二) 5.3 android使用gson解析 5.4 android使用fastjson解析 六、Android常用UI控件编程 ...

    munki-pkg:回购munkipkg工具和示例项目

    munkipkg是一个简单的工具,用于以一致,可重复的方式从项目目录中的源文件和脚本构建软件包。 尽管您可以使用munkipkg生成与Munki( )一起使用的软件包,但munkipkg构建的软件包只是普通的Apple安装程序软件包,...

Global site tag (gtag.js) - Google Analytics