`
pan_java
  • 浏览: 280828 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

将实体转成JSON实体

    博客分类:
  • java
阅读更多
http://www.iteye.com/topic/484519已发布了成型工具包,还包括相关工具.



定义一个注解


@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.FIELD })

public @interface JSONValue {

}



实体

package com.ask.admin.entity;

public class Favorite implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -8350231152253261408L;

	// 编号
	@JSONValue
	private int id;
	// 标题
	@JSONValue
	private String title;
	// 地址
	@JSONValue
	private String uri;
	// 分类
	private int fCategory;
	// 描述
	@JSONValue
	private String fdesc;
	// 状态
	private int status;

	private int author;

	private FavoriteCategory favoriteCategory = new FavoriteCategory();

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getUri() {
		return uri;
	}

	public void setUri(String uri) {
		this.uri = uri;
	}

	public int getFCategory() {
		return fCategory;
	}

	public void setFCategory(int category) {
		fCategory = category;
	}

	public String getFdesc() {
		return fdesc;
	}

	public void setFdesc(String fdesc) {
		this.fdesc = fdesc;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}

	public int getAuthor() {
		return author;
	}

	public void setAuthor(int author) {
		this.author = author;
	}

	public FavoriteCategory getFavoriteCategory() {
		return favoriteCategory;
	}

	public void setFavoriteCategory(FavoriteCategory favoriteCategory) {
		this.favoriteCategory = favoriteCategory;
	}

}


转换函数
public class EntityConversionJSON {

	@AskLogger
	private static Logger logger;

	/**
	 * 实体的值转成JSON对象的值
	 * 
	 * @param source
	 * @param dest
	 */
	public static void entityToJSON(Object source, JSONObject dest) {

		Class clzss = source.getClass();

		Field[] fields = clzss.getDeclaredFields();

		try {
			for (Field field : fields) {
				//确认是否带有JSONValue注解
				if (field.getAnnotation(JSONValue.class) != null) {
					dest.put(field.getName(), getFieldValue(source, field
							.getName()));
				}
			}
		} catch (Exception e) {
			logger.error(e);
			throw new RuntimeException(e);
		}
	}

	/**
	 * 获取字段的值
	 * 
	 * @param data
	 * @param fieldName
	 * @return
	 */
	public static Object getFieldValue(Object data, String fieldName) {
        
		StringBuilder sb = new StringBuilder();
		
		Class clzss = data.getClass();
		
		//将字段首字母大写
		String firstWord = fieldName.substring(0, 1).toUpperCase();
		sb.append(firstWord);
		sb.append(fieldName.substring(1, fieldName.length()));

		final String methodName = "get" + sb.toString();

		Method[] methods = clzss.getDeclaredMethods();
		try {
			for (Method method : methods) {
				// 调用对应的方法
				if (methodName.equals(method.getName())) {
					return method.invoke(data, new Object[] {});
				}
			}

		} catch (Exception e) {
			logger.error(e);
			throw new RuntimeException(e);
		}

		return null;

	}

}



运用

JSONObject jsonFavorite = new JSONObject();
			EntityConversionJSON.entityToJSON(favorite, jsonFavorite);

分享到:
评论
17 楼 e_ville 2009-10-12  
XStream也可以完成这种Java对象到JSON对象的转换咯,还可以嵌套,不错。推荐大家试下
16 楼 love1907 2009-10-12  
JSON是一个VIEW相关的,用不着侵入吧,我觉得用第三方JAR来组装,是最佳实再方式,或许要比你的实现多写一些代码。。。
15 楼 leisure 2009-10-10  
不如用工具类直接转换方便
14 楼 pan_java 2009-10-10  
vlinux 写道
貌似不支持级联那

而且我建议,这个注释同时也支持ElementType.TYPE比较好,因为当我需要对一个Bean进行完全转换的时候,只需在类定义处打上一个注释就好了,这样所有的属性都会按照预先约定的格式进行转换。

而且这种转换的框架最好能作成双向的,否则在一些特殊约定的限制下(比如对数组的处理),只实现一个方向并没有多大用途。

你也可以考虑在上边添加上验证数据长度、not null、正则的验证框架,这样就更能扩充框架的功能了。

不用太担心性能,要知道如果是HTTP短连接模式的接口,建立TCP三次握手、处理HTTP请求的开销可比这大多了。


我会努力的,这个库还在不断的完善中!
13 楼 vlinux 2009-10-10  
貌似不支持级联那

而且我建议,这个注释同时也支持ElementType.TYPE比较好,因为当我需要对一个Bean进行完全转换的时候,只需在类定义处打上一个注释就好了,这样所有的属性都会按照预先约定的格式进行转换。

而且这种转换的框架最好能作成双向的,否则在一些特殊约定的限制下(比如对数组的处理),只实现一个方向并没有多大用途。

你也可以考虑在上边添加上验证数据长度、not null、正则的验证框架,这样就更能扩充框架的功能了。

不用太担心性能,要知道如果是HTTP短连接模式的接口,建立TCP三次握手、处理HTTP请求的开销可比这大多了。
12 楼 kimmking 2009-10-10  
有时间我发个我自己写的吧
本来是一个远程调用项目,序列化对象成xml,后来发现改改就能序列化json
11 楼 houlc 2009-10-10  
json如何传递blob,clob的数据?
10 楼 pan_java 2009-10-09  
yangtao309 写道
写个通用的
能够json化单一对象
和json化树形集合的



近期有空实现一下分享给大家
9 楼 01404421 2009-10-09  
我用的nutz的解析功能,很简洁,支持LZ自己写
8 楼 whaosoft 2009-10-09  
Ihavegotyou 写道
同意kimmking。 到http://www.json.org/ 去下载 java相关的Source.  这样更好维护,也不容易出错。


支持这两位说的我一直用官方那个 那个足够用了
7 楼 yangtao309 2009-10-09  
写个通用的
能够json化单一对象
和json化树形集合的

6 楼 vanlin 2009-10-09  
是个好办法,,之前我考虑的是用个类来解析,用 注解先标识一下也不错。
5 楼 pan_java 2009-10-09  
Ihavegotyou 写道
同意kimmking。 到http://www.json.org/ 去下载 java相关的Source.  这样更好维护,也不容易出错。

学习注解和反射很好的引导,当时只是为了方便没有想那么多.
谢谢指点!
4 楼 Ihavegotyou 2009-10-09  
同意kimmking。 到http://www.json.org/ 去下载 java相关的Source.  这样更好维护,也不容易出错。
3 楼 zhc520 2009-10-09  
谢谢!领教了!
2 楼 kimmking 2009-10-09  
思路不错,but json序列化还是用非入侵pojo的方式比较好。
而且太简单,没有处理常见数据类型和自定义类型。
1 楼 d-jasonlee 2009-10-09  
谢谢分享,一直在用JASONPLUGIN,有空自己实现一个,呵呵

相关推荐

Global site tag (gtag.js) - Google Analytics