[HTTP那些事] JSON数据
随着Android的发展,各路大神的贡献,我们可用的轮子越来越多。比如HTTP请求框架,有自家的Volley,Square的okhttp, async-http-lib, 还有聚合版的xUtils以及AFinal。我想你肯定用过其中一个。
当然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解析了。
就说这么多,留点时间给大家自己思考下,下面再说解决方案
[HTTP那些事] JSON数据的更多相关文章
- JS-利用ajax获取json数据,并传入页面生成动态tab
封装好的:ajax.js function ajax(url, fnSucc,fnFaild){ //1[创建] if(window.XMLHttpRequest){ var oAjax = new ...
- SpringMVC中响应json数据(异步传送)
1.首先导入3个jar包: jackson-annotations-2.1.5.jar jackson-core-2.1.5.jar jackson-databind-2.1.5.jar JSON所需 ...
- 使用TSQL查询和更新 JSON 数据
JSON是一个非常流行的,用于数据交换的文本数据(textual data)格式,主要用于Web和移动应用程序中.JSON 使用“键/值对”(Key:Value pair)存储数据,能够表示嵌套键值对 ...
- 利用Python进行数据分析(2) 尝试处理一份JSON数据并生成条形图
一.JSON 数据准备 首先准备一份 JSON 数据,这份数据共有 3560 条内容,每条内容结构如下: 本示例主要是以 tz(timezone 时区) 这一字段的值,分析这份数据里时区的分布情况. ...
- Salesforce Apex 使用JSON数据的示例程序
本文介绍了一个在Salesforce Apex中使用JSON数据的示例程序, 该示例程序由以下几部分组成: 1) Album.cls, 定了了封装相关字段的数据Model类 2) RestClient ...
- MVC使用ajax异步刷新时怎样输出从后台中传过来的JSON数据
前言 这几天在学习MVC使用AJAX异步刷,因为是新手.所以在js中传参数到后台以及后台返回数据到前台怎么接受,怎么前台遍历出JSON数据都开始不知道,相信新手在使用时跟我一样会遇到,这里我就和大家分 ...
- ASP.NET提取多层嵌套json数据的方法
本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: {"name":&quo ...
- jQuey知识点三 解析json数据
1.解析简单数据 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="vie ...
- JSON数据的使用
JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON ...
随机推荐
- LR测试心得
====================测试方案—优化前—优化后 每一项至少两份报告==================================== url录制方式录制出来的脚本mode是HT ...
- 生成唯一编号(序列号)--sql存储过程
CREATE procedure [dbo].[P_Sys_GetSerialNo] --取业务序列号 @SeqType int, --序列号类别,4位数,如:10+2+1 即1021 , --要取的 ...
- Android相机、相册获取图片显示并保存到SD卡
Android相机.相册获取图片显示并保存到SD卡 [复制链接] 电梯直达 楼主 发表于 2013-3-13 19:51:43 | 只看该作者 |只看大图 本帖最后由 happy小妖同学 ...
- [Effective JavaScript 笔记]第41条:将原型视为实现细节
对象原型链 一个对象给其使用者提供了轻量.简单.强大的操作集.使用者与一个对象最基本的交互是获取其属性值和调用其方法.这些操作不是特别在意属性存储在原型继承结构的哪个位置.随着时间推移,实现对象时可能 ...
- Delphi10 安装Graphics32
一.下载Graphics安装包 官网:www.graphics32.org 下载地址:http://sourceforge.net/projects/graphics32/files/graphics ...
- SharePoint Word 转换PDF服务介绍及示例
前言:在SharePoint使用过程中,经常会发现将文档进行格式转换的需求,之前,看到SharePoint 2013有将PPT转换PDF文档的服务,后来,才发现SharePoint 2010开始,就有 ...
- css 中的度量单位
px 相对长度单位.像素(Pixel). 像素是相对于显示器屏幕分辨率而言的.譬如,WONDOWS的用户所使用的分辨率一般是96像素/英寸.而MAC的用户所使用的分辨率一般是72像素/英寸. em 相 ...
- 【原创】Mapped Statements collection does not contain value for DaoImpl.method
问题: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.Pers ...
- 通过Java反射来理解泛型的本质
集合框架中经常会使用泛型指定集合中所存放元素的类型,保证集合的统一性,从集合中取出元素的时候也避免了类型强制转换的操作,所以我们使用常规的方式来往集合中存放元素的时候,如果指定泛型,那么我们只能向集合 ...
- 利用 Chromium Embedded Framework (CEF) 定制提取 Flash 视频的浏览器
功能介绍: 利用 CEF 分析网页源码, 提取 flash 视频的代码. 提取的视频代码 LoadString 和 JS 两种方式重新插入到浏览器. (CEF_3.2171.1979_win32 - ...