• Android前后端交互细节--Json转化为对象的原理


    移动互联网用户基数越来越大,除了一些工具类(指南针、手电筒等)的应用,绝大部分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 包中。

    (java.lang.reflect包中所有类)

    2什么是泛型

    泛型是JDK1.5开始提供的,它实现了“参数化类型”的概念,可以提高程序的可读性和稳定性,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。相对比较安全,比如可以在运行期避免发生java.lang.ClassCastException异常。

    上图中红框圈主的地方就用到了泛型,而且是用在了集合类中,当然还可以使用在方法和接口中,分别称为泛型类、泛型方法及泛型接口,这里就不一一说明了。

    3如何转换?

    实现方法参考以下代码即可,注释的比较详细,还是比较简单的。

    代码中集合对象的解析相对复杂一些,参考以下代码,其实就是用了个迭代。

    小结

    以上代码中的数据类型不够完全,比如还会遇到属性是复杂对象、Date、Enum、Map 之类的,也可以通过其它的办法来进行转化,比如根据对象的属性进行一一赋值。

    可以从https://github.com/StarKeyMan/JsonToObject.git下载代码进行完善。

  • 相关阅读:
    [ZJOJ] 5772【NOIP2008模拟】今天你AK了吗
    exgcd扩展欧几里得求解的个数
    Dinic当前弧优化 模板及教程
    [Luogu] P3907 圈的异或
    提升——树形DP
    C++ 优先队列
    C++ 洛谷 P2458 [SDOI2006]保安站岗 from_树形DP
    C++ 洛谷 2014 选课 from_树形DP
    C++ luogu1352没有上司的舞会 from_树形DP
    浅说——树形DP
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7027125.html
Copyright © 2020-2023  润新知