[HTTP那些事] JSON数据
2015-07-29 20:18
330 查看
随着Android的发展,各路大神的贡献,我们可用的轮子越来越多。比如HTTP请求框架,有自家的Volley,Square的okhttp, async-http-lib, 还有聚合版的xUtils以及AFinal。我想你肯定用过其中一个。
当然Stay今天不是来科普的,而是来跟大家一起思考一个问题的。我们暂且不提他们在内部做了多少优化,我们就说lib的返回数据。
在常用的http请求的返回值中,文件,JSON占绝大多数(图片有其他框架,这里不考虑)。文件下载都有专门的response,会帮你下载到制定路径,这个肯定都支持。那JSON呢?貌似都返回一个JSONObject或者JSONArray。
我去,做好事得做全啊,返回JSONObject是个什么鬼,难道还得自己动手写解析反序列化成自己要得对象?那是最低级的程序员干的事。好在我们都不傻,还有GSON,fastJson,Jackson帮我们来完成这步转化。
比方说服务器返回的数据:(双引号没加,占位置,别喷)
对应的对象:
好,那我们只需要在response回调时拿到result,调用json-lib反序列化就可以了,比如这样:
现在我们就可以使用user对象来更新UI了对吧。就多了一行代码,没强迫症的也就忍过去了。
接下来我们再看下面一种json数据:
我去,这是什么鬼,不好好遵守http协议,统一返回200是什么鬼,token不合法给我返回401 error code不好吗。。别说,很多公司都这么定义返回数据的
这样我们怎么办。。多写一步解析咯。
天啊,即使没强迫症,大概也会受不了每个API请求都写这么多代码了吧。
BB了这么多,大家应该懂我想表达什么了吧?
为什么不直接将json转换成我们要的对象User再回调呢?
而且在json数据大的情况下,反序列化还是耗时操作,有可能会卡UI的好吗。
这可能么?当然可以,不然Stay铺垫这么多干嘛。不过在Stay说解决方案之前,大家可以试着自己考虑下实现。
我们拿到的是String,格式是JSON
每次拿到JSON String,我们都来做了一步反序列化对象操作
gson.fromJson需要两个参数(String JSON,Class dest)
回调参数得变成onResponse(User user)
框架层得知道Class dest
如果能把这些事情想清楚,你就可以很顺利得扩展那些开源框架了,以后你也再不用手写json解析了。
就说这么多,留点时间给大家自己思考下~
最后说下需要用到得知识点:泛型,反射
当然Stay今天不是来科普的,而是来跟大家一起思考一个问题的。我们暂且不提他们在内部做了多少优化,我们就说lib的返回数据。
在常用的http请求的返回值中,文件,JSON占绝大多数(图片有其他框架,这里不考虑)。文件下载都有专门的response,会帮你下载到制定路径,这个肯定都支持。那JSON呢?貌似都返回一个JSONObject或者JSONArray。
我去,做好事得做全啊,返回JSONObject是个什么鬼,难道还得自己动手写解析反序列化成自己要得对象?那是最低级的程序员干的事。好在我们都不傻,还有GSON,fastJson,Jackson帮我们来完成这步转化。
比方说服务器返回的数据:(双引号没加,占位置,别喷)
{name:stay, age:17, job:soho}
对应的对象:
Class User{ public String name, public int age, public String job }
好,那我们只需要在response回调时拿到result,调用json-lib反序列化就可以了,比如这样:
User user = gson.fromJson(result, User.class)
现在我们就可以使用user对象来更新UI了对吧。就多了一行代码,没强迫症的也就忍过去了。
接下来我们再看下面一种json数据:
{resCode:200, data:{name:Stay, age:17, job:soho}, msg:success} {resCode:401, data:{}, msg:token invalid}
我去,这是什么鬼,不好好遵守http协议,统一返回200是什么鬼,token不合法给我返回401 error code不好吗。。别说,很多公司都这么定义返回数据的
这样我们怎么办。。多写一步解析咯。
JSONObject json = new JSONObject(result) JSONObject data = json.optJSONObject("data") if(data != null){ User user = gson.fromJson(data.toString(), User.class) }
天啊,即使没强迫症,大概也会受不了每个API请求都写这么多代码了吧。
BB了这么多,大家应该懂我想表达什么了吧?
为什么不直接将json转换成我们要的对象User再回调呢?
而且在json数据大的情况下,反序列化还是耗时操作,有可能会卡UI的好吗。
这可能么?当然可以,不然Stay铺垫这么多干嘛。不过在Stay说解决方案之前,大家可以试着自己考虑下实现。
我们拿到的是String,格式是JSON
每次拿到JSON String,我们都来做了一步反序列化对象操作
gson.fromJson需要两个参数(String JSON,Class dest)
回调参数得变成onResponse(User user)
框架层得知道Class dest
如果能把这些事情想清楚,你就可以很顺利得扩展那些开源框架了,以后你也再不用手写json解析了。
就说这么多,留点时间给大家自己思考下~
最后说下需要用到得知识点:泛型,反射
相关文章推荐
- dom4j 读取网络的xml
- 有关H.265
- 基于JGraphX的通风网络解算---通风网络解算中出现风量为负值的处理
- Htttp网络框架之Netroid (针对大文件的下载)
- Linux 网卡驱动学习(二)(网络驱动接口小结)
- 网络流24题 (一)
- linux_c 网络开发日记(4)多进程程序设计_进程控制原理
- Android网络状态广播监听
- Linux 网卡驱动学习(一)(分析一个虚拟硬件的网络驱动例子)
- Python写的Web spider(网络爬虫)
- 网络流初步
- PHP输出http状态码以及常用状态码
- 大型网络游戏服务器的框架设计
- mac与phy如何实现网络自适应
- iOS实时监测网络状况
- nginx中http.server.location指令语法
- 伪造Http请求IP地址
- 一个使用超简单C++封装的网络库(包含服务器端和客户端,跨平台,比较适用于移动终端)
- 【HttpClient4.5中文教程】【第一章 :基础】1.1执行请求(一)
- HTTP协议的chunked编码 http://www.cnblogs.com/zhaozhan/archive/2010/08/24/1807639.html