`
larlf
  • 浏览: 105643 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java Bean和JSON相互转换的思路

阅读更多
打算在新的AJAX实现中用JSON做为数据传递的格式,看了JSON的资料,很合我意,结构简单,冗余数据少,在JavaScript中使用方便。但是看了相关的Project,没有找到一个在Java Bean和JSON之间转换的好工具。在这方面,Xtream做的算是不错的了,但是和我的希望还是有点差距,而且也不想因为这为这个原因就把Xtream这套庞大的东西都加到我的架构中去,必竟,我的一向的原则是:简单就是美。

于是写了一个Utils类,来实现我的这个想法,代码还没有完全实现,基本的用法在这里描述一下。

从Bean到JSON的过程:

BeanA a=new BeanA();
a.setName("Seally");
a.setSex("女");
a.setAge(25);
a.getList().add("one");
a.getList().add("two");
a.getList().add("three");
a.setArray(new String[]{"111","222","333"});

BeanB b=new BeanB();
b.setName("Larlf");
b.setIarray(new int[]{7,8,9,10});
a.setObj(b);

log.debug(JsonUtils.object2JsonString(a));
最后的结果会输出JSON字符串:

{"sex":"女","name":"Seally","age":25,"class":"com.opesoft.tools.BeanA","obj":{"iarray":[7,8,9,10],"name":"Larlf","class":"com.opesoft.tools.BeanB"},"list":["one","two","three"],"array":["111","222","333"]}


最后的字符串中会把Bean的Class生成为一个属性,这点在反向转换时起着重要作用。Array和Collection属性没有生成对应的Class,因为这部分信息可以通过反射的方法从对象中取出。Object属性就要有Class,因为很可能反射取出的是接口或父类,这里一定要把具体对象的类型保留下来。

反向生成对象代码如下:

String str2="{\"sex\":\"女\",\"name\":\"Seally\",\"age\":25,\"class\":\"com.opesoft.tools.BeanA\",\"obj\":{\"iarray\":[7,8,9,10],\"name\":\"Larlf\",\"class\":\"com.opesoft.tools.BeanB\"},\"list\":[\"one\",\"two\",\"three\"],\"array\":[\"111\",\"222\",\"333\"]}";
JSONObject json2=new JSONObject(str2);
BeanA bean2=(BeanA)JsonUtils.json2Object(json2);
log.debug(((BeanB)bean2.getObj()).getName());[\code]

从输出的信息可以看到根据JSON字符串重新构建出了对象。

111


这个工具类的思路基本如此,实现上还不是很完善,比如说对Collection属性的支持还不好,多维数组当前也不支持。最近几天我会把它的功能给补充完整,有了一个可用的版本就把原代码给发布上来。




分享到:
评论
6 楼 larlf 2015-10-12  
没想到多年前的文章还有人回复,从前这个架构里的数据转换部分早已经改为使用gson了,感谢关注!
5 楼 wzwahl36 2015-10-07  
Json在线转Javabean工具 http://www.atool.org/json2javabean.php
4 楼 dwangel 2009-07-29  
   1. class MyBean{ 
   2.    private List data; 
   3.    // getters & setters 
   4. } 
   5.  
   6. class Person{ 
   7.    private String name; 
   8.    // getters & setters 
   9. } 
  10.  
  11. ... 
  12.  
  13. String json = "{'data':[{'name':'Wallace'},{'name':'Grommit'}]}"; 
  14. Map classMap = new HashMap(); 
  15. classMap.put( "data", Person.class ); 
  16. MyBean bean = JSONObject.toBean( JSONObject.fromObject(json), MyBean.class, classMap ); 
3 楼 birdjavaeye 2007-10-25  
还有很重要的一点要处理:
BeanA a = new BeanA();
BeanB b = new BeanB();
a.setWife(b);
b.setHusband(a);

这样的情况类似hibernate中的many to one以及双向关联,要能正确处理:
BeanA a2 = (BeanA)JsonUtils.json2Object(JsonUtils.object2JsonString(a));
assertSame(a2, a2.getWife().getHusband());

如果采用JSON作字符串格式,这方面相当不好处理
你可以看一下Objot、PHPRPC、Buffalo的源码,都抛弃了JSON,才能快速方便地处理这种情况
2 楼 larlf 2007-06-26  
和JSON-Lib不同的地方在于,我希望如果对象A转换成Json字符串,通过这个字符串还能还原出对象A来,而不是像JSON-Lib那样还原后是一个MorphDynaBean对象。
1 楼 pzhifeng 2007-06-19  

JSONObject.fromBean();

JSONObject.toBean();

这两个方法不能满足你所提的要求吗?

相关推荐

Global site tag (gtag.js) - Google Analytics