`
jessdy
  • 浏览: 61285 次
  • 性别: 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
分享到:
评论

相关推荐

    java普通类编译成json但只是当前类的有getter、setter方法的版本

    在Java编程中,将普通类转换为JSON对象是一种常见的需求,特别是在处理Web服务或数据交换时。这个场景中提到的是将一个Java类编译成JSON,但只包含那些具有getter和setter方法的属性。这样的转换有助于减少JSON输出...

    JSON转EXCEL文件离线安装包

    JSON转EXCEL文件离线安装包是一个专为C# WinForm平台设计的应用程序,它能够方便地将JSON数据转换成Excel格式,以便于数据分析、报表生成或者数据存储。这个安装包包含了所有必要的组件,用户无需在线下载多个依赖库...

    将对象转换为json串的工具类.pdf

    `Obj2StrUtil` 是一个Java工具类,它的主要功能是将Java对象转换成JSON格式的字符串。这个类主要处理了四种类型的对象:Map、List、数组以及普通的Java Bean对象。以下是这个类的具体解析: 1. **处理Map对象** `...

    JAVA转换JSON jar

    3. **commons-lang-2.3.jar**:Apache Commons Lang是Java标准类库的补充,包含了一些实用的工具类,可能在数据转换过程中提供辅助功能。 4. **commons-beanutils-1.7.0.jar**:Apache Commons BeanUtils简化了...

    解析json工具

    在解析JSON时,通常会遇到四种主要类型的数据结构,这正是你提到的“详细json工具”所涵盖的分类: 1. **普通JSON字段**:这是最基本的JSON结构,包括键值对(key-value pairs)。键用双引号括起,值可以是字符串、...

    json转换工具类

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

    JSON 查看工具

    3. **普通JSON类型**:除了数组,还支持对象、字符串、数字、布尔值、null等多种JSON基本类型,工具会按照规范展示这些数据。 4. **一键解析**:快速解析复杂或大量的JSON数据,节省开发者的时间和精力。 5. **便于...

    C# JSON格式化转换辅助类 ConvertJson

    总体来说,ConvertJson辅助类提供了一套简单的工具方法来处理基本的JSON格式化和转换需求,这使得开发人员可以在没有第三方库支持的情况下快速实现简单的JSON处理。类中的方法都使用了StringBuilder来构建最终的字符...

    json转java包

    总结来说,"json转java包"可能是一个集成了JSON解析、MyBatis代码生成和MySQL连接的工具或库,它的目的是简化Java开发者处理JSON数据以及与数据库交互的过程,提高开发效率。在实际使用时,开发者需要结合提供的jar...

    json.rar_JSON_c json_json linux_json 类_json-lib

    提供的“json”类可能是C++封装的JSON处理类,使得开发者可以像操作普通对象一样操作JSON数据。类中可能有如下方法: - `parse()`:解析JSON字符串并构建内部数据结构。 - `toString()`:将内部数据结构转换回...

    excel和json相互转换

    它提供了序列化和反序列化的功能,使得将对象转换为JSON字符串或从JSON字符串创建对象变得简单。在本例中,这个库可能被用来将Excel数据解析成JSON格式。 3. **ICSharpCode.SharpZipLib.dll**:这是一个开源的.NET...

    Gson包工具类

    Gson包工具类是Google开发的一个Java库,用于在Java对象和JSON数据之间进行映射。这个库使得在Java应用程序中处理JSON变得极其便捷,无论是在Android开发还是普通的Java项目中,Gson都是一个非常实用的工具。JSON...

    Json帮助类.rar

    这个"Json帮助类.rar"压缩包提供了相关的类库代码,帮助开发者进行这些操作。 首先,我们来看列表集合(List)转换为JSON。在.NET中,可以使用Newtonsoft.Json库的JsonConvert类的SerializeObject方法来实现。例如,...

    Newtonsoft.Json

    总之,Newtonsoft.Json库是.NET开发者处理JSON不可或缺的工具,它提供了丰富的功能和优秀的性能,使得JSON数据的处理变得更加简单和高效。无论是从JSON到.NET对象,还是从.NET对象到JSON,Json.NET都能提供强大而...

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

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

    Newtonsoft.Json .net framework4.0版

    总之,Newtonsoft.Json .NET Framework 4.0版是.NET开发者处理JSON数据不可或缺的工具,其强大的功能、易用的API和广泛的社区支持,使其在.NET生态系统中保持着领先地位。无论是简单的数据交换还是复杂的JSON操作,...

    AS3 JSON 包

    AS3中的JSON对象通常以键值对的形式存在,你可以通过创建一个普通的AS3对象来表示JSON数据,然后使用`JSON.stringify()`方法将其转换为JSON字符串。例如: ```actionscript var myData:Object = {name: "John", ...

    适用于Unity WebGL的JsonNet,普通的JsonNet是不能运行在webgl上的

    `JsonUtility`是一个轻量级的JSON处理工具,可以满足基本的序列化和反序列化需求。但它的功能相对较弱,对于复杂的JSON结构可能不够用。 3. **Json.Net for Unity**:为了在Unity WebGL中使用JsonNet,开发者社区...

Global site tag (gtag.js) - Google Analytics