论坛首页 Java企业应用论坛

简单实用的Object2JSON小工具:JSONUtil

浏览 9921 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-06-12   最后修改:2009-06-25
本工具用来把Java对象转换成JSON格式输出.小巧实用,接口友好欢迎大家拍砖,指导.

1 基本功能:
1.1 支持基本类型及其包装类和Date的解析.
1.2 支持指定关联关系类的解析
1.3 支持数组,List的解析
1.4 支持忽略一层嵌套类(见说明 3.2)

2 基本调用方法:
JSONUtil.object2JSON(object,stringBuffer,new Class[]{...});


3 说明:
3.1 思路就是解析指定你想要解析的类(new Class[]{...}),然后通过StringBuffer输出.你指定什么就解析什么,不指定就不解析.这样做的目的就是既能自动解析对象又能减少无意义的数据解析也能从另一个层面避免嵌套. 如果不需要指定可以写成这样:
JSONUtil.object2JSON(object,stringBuffer)

3.2 root object 的类型不用指定,只需要指定内部属性就行。
3.3 嵌套不好防范,已经是你自己手动指定,所以请注意不要出现嵌套.本身出现嵌套的模型可能也有问题吧?就算是tree nodes也通常用是外键关联parent id来处理的。所以我基本是放弃了嵌套的处理,由你自己指定要处理的类,自己注意。
3.4 POJO里最好不要有setter,getter之外的方法,如果需要你完全可以写到工具类。已经处理过出现单独属性的情况.
3.5 可以定义DateFormat的格式,见下面的范例4.3
3.6 源码和UT附件下载.

4 范例:4.1基本解析:
	WordType wt = new WordType();
	wt.setName("f");
	wt.setId(3);
		
	Word w = new Word();
	w.setName("a");
	w.setType(wt);
	JSONUtil.object2JSON(w,stringBuffer,new Class[]{WordType.class});


输出:
Word:{"name":"a","type":{"id":3,"name":"f"}}


4.2 数组和List解析
	Tag t = new Tag();
	t.setName("t");
	Tag tt = new Tag();
	tt.setName("tt");
	Tag[] ttt = {t,tt};
		
	WordType wt = new WordType();
	wt.setName("f");
	wt.setId(3);
		
	Word w = new Word();
	w.setName("a");
	w.setType(wt);
	w.setTags(ttt);
		
	WordType wtt = new WordType();
	wtt.setName("gg");
	wtt.setId(2);
	
	Word ww = new Word();
	ww.setName("aa");
	ww.setType(wtt);
	ww.setTags(new Tag[]{t});
	List<Tag> tagList = new ArrayList<Tag>();
	tagList.add(t);
	tagList.add(tt);
	ww.setTagList(tagList);
	JSONUtil.object2JSON(new Word[]{w,ww},stringBuffer,new Class[]{WordType.class,Tag.class});


输出:
[Word:{"name":"a","tags":[{"name":"t"},{"name":"tt"}],"type":{"id":3,"name":"f"}},Word:{"name":"aa","tagList":[{"name":"t"},{"name":"tt"}],"tags":[{"name":"t"}],"type":{"id":2,"name":"gg"}}]


4.3 基本类型,包装类,日期解析
	LangObject lo = new LangObject();
	lo.setBooleanValue(true);
	lo.setByteValue(Byte.valueOf("2"));
	lo.setCharacterValue(Character.valueOf('3'));
	lo.setDoubleValue(4.0);
	lo.setFloatValue(5f);
	lo.setIntegerValue(6);
	lo.setLongValue(7l);
	lo.setShortValue(Short.valueOf("8"));
		
	lo.setBooleanObject(true);
	lo.setByteObject(Byte.valueOf("2"));
	lo.setCharacterObject(Character.valueOf('3'));
	lo.setDoubleObject(4.0);
	lo.setFloatObject(5f);
	lo.setIntegerObject(6);
	lo.setLongObject(7l);
	lo.setShortObject(Short.valueOf("8"));
		
	lo.setUtilDate(new java.util.Date());
	lo.setSqlDate(java.sql.Date.valueOf("2009-6-6"));
	
	JSONUtil.DATE_FORMAT = "yyyy/MM/dd";
	JSONUtil.object2JSON(lo,stringBuffer);


输出:
LangObject:{"booleanObject":"true","booleanValue":"true","byteObject":2,"byteValue":2,"characterObject":"3","characterValue":"3","doubleObject":4.0,"doubleValue":4.0,"floatObject":5.0,"floatValue":5.0,"integerObject":6,"integerValue":6,"longObject":7,"longValue":7,"shortObject":8,"shortValue":8,"sqlDate":"2009/06/06","utilDate":"2009/06/12"}


2009-6-25
上传:
用Collection接口替代List
去掉对象名
   发表时间:2009-06-12  
每个对象前面的对象名称能不能不显示?
0 请登录后投票
   发表时间:2009-06-12  
liangx 写道
每个对象前面的对象名称能不能不显示?

可以啊,只是目前被我去掉了。 一般显示属性名吧?要是觉得simple类名好,我可以加上开关。
0 请登录后投票
   发表时间:2009-06-25  
自己改了.其实现在有很多JSON的库.但是那些无用的功能太多.试了一下这个.功能不错.拿来用了.不介意吧!
0 请登录后投票
   发表时间:2009-06-25   最后修改:2009-06-25
呵呵,我前几天刚自己实现了一个这样的工具。

建议: 实现一个反向的功能, 就是json2Object.
0 请登录后投票
   发表时间:2009-06-25   最后修改:2009-06-25
liangx 写道
自己改了.其实现在有很多JSON的库.但是那些无用的功能太多.试了一下这个.功能不错.拿来用了.不介意吧!

的确,我这边的也改了,因为那样会照成json格式不合法。我尽快上传。
开源的当然不介意啊.
0 请登录后投票
   发表时间:2009-06-25   最后修改:2009-06-25
grandboy 写道
呵呵,我前几天刚自己实现了一个这样的工具。

建议: 实现一个反向的功能, 就是json2Object.


如 liangx 的需求,他要求不要用变量名也不用类名做json的对象名。要实现反向必须用类名,不然无法find class for name.这里就出现矛盾了。

而且这里加上类名会使生成json格式不合法。

其他没有什么问题,XML的正向反向我早在XMLUtil里实现了,在博客里有。

另外把支持List变成了支持collection,有空我传一下。
0 请登录后投票
   发表时间:2009-06-25   最后修改:2009-06-25
很久以前写的java2json的转换:
http://www.ibm.com/developerworks/cn/web/wa-lo-json/
0 请登录后投票
   发表时间:2009-06-25   最后修改:2009-06-25
asklxf 写道
很久以前写的java2json的转换:
http://www.ibm.com/developerworks/cn/web/wa-lo-json/

谢谢你的推荐, 犹豫无法下载只能从表面猜测您的做法。
希望能提供源代码,学习您的思想。

从接口上看,我自认为没有我处理的好。指定对象解析,是我提出的要点。
0 请登录后投票
   发表时间:2009-06-25  
jomper 写道
asklxf 写道
很久以前写的java2json的转换:
http://www.ibm.com/developerworks/cn/web/wa-lo-json/

谢谢你的推荐, 犹豫无法下载只能从表面猜测您的做法。
希望能提供源代码,学习您的思想。

从接口上看,我自认为没有我处理的好。指定对象解析,是我提出的要点。


小工具不需要接口,不用搞那么复杂

代码下不了可能是code.google.com还在被挟持中
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics