随着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说解决方案之前,大家可以试着自己考虑下实现。

  1. 我们拿到的是String,格式是JSON

  2. 每次拿到JSON String,我们都来做了一步反序列化对象操作

  3. gson.fromJson需要两个参数(String JSON,Class dest)

  4. 回调参数得变成onResponse(User user)

  5. 框架层得知道Class dest

如果能把这些事情想清楚,你就可以很顺利得扩展那些开源框架了,以后你也再不用手写json解析了。

就说这么多,留点时间给大家自己思考下,下面再说解决方案

[HTTP那些事] JSON数据的更多相关文章

  1. JS-利用ajax获取json数据,并传入页面生成动态tab

    封装好的:ajax.js function ajax(url, fnSucc,fnFaild){ //1[创建] if(window.XMLHttpRequest){ var oAjax = new ...

  2. SpringMVC中响应json数据(异步传送)

    1.首先导入3个jar包: jackson-annotations-2.1.5.jar jackson-core-2.1.5.jar jackson-databind-2.1.5.jar JSON所需 ...

  3. 使用TSQL查询和更新 JSON 数据

    JSON是一个非常流行的,用于数据交换的文本数据(textual data)格式,主要用于Web和移动应用程序中.JSON 使用“键/值对”(Key:Value pair)存储数据,能够表示嵌套键值对 ...

  4. 利用Python进行数据分析(2) 尝试处理一份JSON数据并生成条形图

    一.JSON 数据准备 首先准备一份 JSON 数据,这份数据共有 3560 条内容,每条内容结构如下: 本示例主要是以 tz(timezone 时区) 这一字段的值,分析这份数据里时区的分布情况. ...

  5. Salesforce Apex 使用JSON数据的示例程序

    本文介绍了一个在Salesforce Apex中使用JSON数据的示例程序, 该示例程序由以下几部分组成: 1) Album.cls, 定了了封装相关字段的数据Model类 2) RestClient ...

  6. MVC使用ajax异步刷新时怎样输出从后台中传过来的JSON数据

    前言 这几天在学习MVC使用AJAX异步刷,因为是新手.所以在js中传参数到后台以及后台返回数据到前台怎么接受,怎么前台遍历出JSON数据都开始不知道,相信新手在使用时跟我一样会遇到,这里我就和大家分 ...

  7. ASP.NET提取多层嵌套json数据的方法

    本文实例讲述了ASP.NET利用第三方类库Newtonsoft.Json提取多层嵌套json数据的方法,具体例子如下. 假设需要提取的json字符串如下: {"name":&quo ...

  8. jQuey知识点三 解析json数据

    1.解析简单数据 @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="vie ...

  9. JSON数据的使用

    JSON (JavaScript Object Notation)一种简单的数据格式,比xml更轻巧. JSON 是 JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON ...

随机推荐

  1. 读>>>>白帽子讲Web安全<<<<摘要→我推荐的一本书→1

      <白帽子讲Web安全>吴翰清著 刚开始看这本书就被这本书吸引,感觉挺不错,给大家推荐下,最近读这本书,感觉不错的精华就记录下, 俗话说>>>好脑袋不如一个烂笔头< ...

  2. thinkphp中F方法

    我们已经了解了ThinkPHP中的S方法的用法,F方法其实是S方法的一个子集功能,仅用于简单数据缓存,并且只能支持文件形式,不支持缓存有效期,因为采用的是PHP返回方式,所以其效率较S方法较高,因此我 ...

  3. [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码

    函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...

  4. [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集

    [UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...

  5. C#关键字base

    例子: public CustomStroke(SharpType type) :base() { this.type = type; } 这里的CustomStroke继承与基类Stroke类,用关 ...

  6. ZeroMQ安装

    一.ZeroMQ介绍 ZeroMQ是一个开源的消息队列系统,按照官方的定义,它是一个消息通信库,帮助开发者设计分布式和并行的应用程序. 首先,我们需要明白,ZeroMQ不是传统的消息队列系统(比如Ac ...

  7. HTML快速入门4

    七.表单 1. 概述 建立交互式的站点,需要使用 HTML 表单,它可以让用户提供信息,并对此作出处理.可以建立类似 复选框.单选按钮及文本框的控件. 掌握表单的使用对 Active Server P ...

  8. Shell脚本中cd命令使用

    在写shell脚本的时候发现cd切换目录的时候无法切换,代码是下面的. #!/bin/bash #changedir.sh history cd /home/firefox sleep pwd 我仔细 ...

  9. (0,eval)('this')与eval的区别

    看doT源码的时候,看到了这么一句代码: global = (function(){ return this || (0,eval)('this'); }()); global.doT = doT; ...

  10. .html和.htm的区别

    很多人会认为网页扩展名html和htm是等同的,但事实上他们还是有区别的. 包含HTML内容的文件最常用的扩展名是.html,但是像DOS这样的旧操作系统限制扩展名为最多3个字符,所以.htm扩展名也 ...