移动互联网用户基数越来越大,除了一些工具类(指南针、手电筒等)的应用,绝大部分APP都需要与后端进行交互。
交互的数据格式有JSON、XML等,由于JSON具有语法简单、占用空间小等优势,基本所有的公司都以它来进行数据交互。
在交互中间,就会遇到JSON 数据和JavaBean 对象之间的相互转换问题,比如{"age":11,"name":"David","gender":"woman"}这个JSON 串往往需要转换成Person 对象。
在项目中,我们基本不会自己写这部分代码,因为有一些类似于Gson、Jackson 的框架已经做了这部分工作,它们可以很简单的实现JSON 串与JavaBean 对象之间的相互转换。但是了解其实现的原理及涉及到的一些概念,如反射,对我们了解其他框架甚至自己写框架都是有帮助的。
下面,主要介绍下JSON 数据如何转换为JavaBean 对象及相关的一些概念。主要用到了反射、泛型两个技术点,了解了这两个概念,很容易能搞懂这个原理,并且能初探一些框架的实现原理。
1、什么是反射?
Java 的反射机制是在程序运行期间而不是在编译期间,可以获取某个类的所有方法和属性,可以通过反射的方式进行对象的实例化,能够调用对象的每一个方法,可以通过调用方法或者直接对属性进行赋值。
它使得Java 这种编译性语言有了某些动态语言的特性,极大的增强了程序设计的灵活性,但也会带来点性能的问题(其实也不是个大问题,相对带来的方便,根本不用考虑)。它是构建框架的基础所在,最著名的SSH 集成框架底层实现用到了很多反射机制,可以很灵活的把一些信息放在配置文件中,减少了很大的代码量。
如Spring 的核心机制:依赖注入,就利用了反射来实例化类中的一些属性,达到了控制反转的目的;Struts 利用反射,根据表单中的数据对Action 中的对象进行实例化和对属性进行赋值,具体的应该是调用set 方法;Mybatis、Hibernate 也利用反射把数据库查询结果集实例化成JavaBean 对象。
反射相关的类都在java.lang.reflect 包中。
2、什么是泛型
泛型是JDK1.5开始提供的,它实现了“参数化类型”的概念,可以提高程序的可读性和稳定性,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。相对比较安全,比如可以在运行期避免发生java.lang.ClassCastException异常。
上图中红框圈主的地方就用到了泛型,而且是用在了集合类中,当然还可以使用在方法和接口中,分别称为泛型类、泛型方法及泛型接口,这里就不一一说明了。
3、如何转换?
实现方法参考以下代码即可,注释的比较详细,还是比较简单的。
代码中集合对象的解析相对复杂一些,参考以下代码,其实就是用了个迭代。
小结
以上代码中的数据类型不够完全,比如还会遇到属性是复杂对象、Date、Enum、Map 之类的,也可以通过其它的办法来进行转化,比如根据对象的属性进行一一赋值。
可以从https://github.com/StarKeyMan/JsonToObject.git下载代码进行完善。
本文作者:宋亚伟(点融黑帮),现任点融网北京团队Android开发工程师,工作4年,爱好乒乓球和游泳。