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

Android前后端交互细节--Json转化为对象的原理的更多相关文章

  1. 前后端交互实现(nginx,json,以及datatable的问题相关)

    1.同源问题解决 首先,在同一个域下搭建网络域名访问,需要nginx软件,下载之后修改部分配置 然后再终端下cmd  nginx.exe命令,或者打开nginx.exe文件,会运行nginx一闪而过, ...

  2. ajax学习----json,前后端交互,ajax

    json <script> var obj = {"name": "xiaopo","age": 18,"gender ...

  3. Django之META与前后端交互

    Django之META与前后端交互 1 提交表单之GET 前端提交数据与发送 1)提交表单数据 2)提交JSON数据 后端的数据接收与响应 1)接收GET请求数据 2)接收POST请求数据 3)响应请 ...

  4. content-type常见类型辨析(以ajax与springmvc前后端交互为例)

    博客搬家: content-type常见类型辨析(以ajax与springmvc前后端交互为例) 在http报文的首部中,有一个字段Content-type,表示请求体(entity body)中的数 ...

  5. Node之简单的前后端交互

    node是前端必学的一门技能,我们都知道node是用的js做后端,在学习node之前我们有必要明白node是如何实现前后端交互的. 这里写了一个简单的通过原生ajax与node实现的一个交互,刚刚学n ...

  6. 百度ueditor的图片上传,前后端交互使用

    百度ueditor的使用 一个文本编辑器,看了网上很多文档写的很乱,这里拾人牙慧,整理下怎么使用. 这个东西如果不涉及到图片附件上传,其实很简单,就是几个前端文件,直接引用,然后配置下ueditor. ...

  7. 【开源.NET】 轻量级内容管理框架Grissom.CMS(第二篇前后端交互数据结构分析)

    这是 CMS 框架系列文章的第二篇,第一篇开源了该框架的代码和简要介绍了框架的目的.作用和思想,这篇主要解析如何把sql 转成标准 xml 配置文件和把前端post的增删改数据规范成方便后台解析的结构 ...

  8. thinkphp+jquery+ajax前后端交互注册验证

    thinkphp+jquery+ajax前后端交互注册验证,界面如下 register.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1. ...

  9. nodejs实现前后端交互

    本人nodejs入门级选手,站在巨人(文殊)的肩膀上学习了一些相关知识,有幸在项目中使用nodejs实现了前后端交互,因此,将整个交互过程记录下来,方便以后学习. 本文从宏观讲述nodejs实现前后端 ...

随机推荐

  1. UESTC 1584

    http://acm.uestc.edu.cn/#/problem/show/1584 Washi与Sonochi的约定 Time Limit: 3000/1000MS (Java/Others)   ...

  2. js垃圾回收机制理解

    原理 找到不再被使用的变量,然后释放其占用的内存,但这个过程不是时时的,因为其开销比较大, 所以垃圾回收器会按照固定时间间隔周期性的执行 回收方式 a.标记清除 当变量进入环境时,将这个变量标记为“进 ...

  3. OpenCASCADE Job - 武汉中南

    中南设计集团(武汉)工程技术研究院有限公司是中南工程咨询设计集团有限公司(以下简称“中南设计集团”)打造的工程技术研发和科研创新平台,为中南设计集团旗下全资子公司,于2018年2月成立.公司业务范围涵 ...

  4. 深入解析开源项目之Universal-Image-Loader(二)硬盘---缓存篇

    文件命名: FileNameGenerator,HashCodeFileNameGenerator,Md5FileNameGenerator package com.nostra13.universa ...

  5. mybatis在XML中大于号转义字符

    mybatis在编写sql时不能在XML里直接使用‘<’ 或者是 ‘>’ 在这里需要使用转义字符替换 下面列举常用的xml转义对应: * <           <       ...

  6. C/C++(基础-运算符详解)

    运算符 任何表达式是有值的 int a = 2; int b = 3; a*=b+4;//a=a*(b+4);"*"*=的优先级层次和=号的层次一样. printf("% ...

  7. Markdown最简单常用的语法

    1,文本强调: 文本倾斜,*我是倾斜的文本* 文本加粗,**我是加粗的文本** 文本删除线,~~带删除线的文本~~ 2,链接,分为行内式与参数式,参数式多用于在文章中多次使用相同的链接 行内式写法:[ ...

  8. 【DRF分页】

    目录 第一种 PageNumberPagination 查第n页,每页显示n条数据 第二种 LimitOffsetPagination 在第n个位置,向后查n条数据 第三种 CursorPaginat ...

  9. 小米开源文件管理器MiCodeFileExplorer-源码研究(7)-Favorite收藏管理和SQLite数据库CRUD

    FavoriteDatabaseHelper,存储favorite数据,到SQLite数据库.SQLiteOpenHelper是一个帮助管理数据库和版本的工具类.通过继承并重载方法,快速实现了我们自己 ...

  10. C# 的时间戳 在flash actionscript中使用

    眼下在做一个项目,要以字节的方式传时间戳到flash中, 错误的就不写了.仅仅写一个能够使用的例如以下: C# DateTime centuryBegin = new DateTime(1970, 1 ...