从零开始搞懂Android网络请求——JSON数据的解析与Gson框架的使用

来源:互联网 发布:淘宝素材图片 编辑:程序博客网 时间:2024/06/05 10:28

什么是JSON:

  • JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
  • JSON 是轻量级的文本数据交换格式
  • JSON 独立于语言 (单纯的数据格式,不受语言的约束)
  • JSON 具有自我描述性,更易理解

    以上为官方对于Json的解释,其实JSON就是一种JavaScript对象数据表示格式,不受程序语言的限制,以至于成为了目前前后台数据交互的通用数据格式,并逐渐地取代了XML。

本篇博客主要讲解解析JSON数据的方法,包括:

  • 原生解析方法:使用了JSON官方的一个Jar包,Android SDK里面已经自带了,所以不需要单独下载。
  • GSON框架解析:google 提供的快速json的第三方框架。

JSON原生解析


JSONObject对象解析

首先看一下我们即将解析的数据:

{    "data":{        "title":"How to get JOSN data",        "author":"Zergen",        "content":"Please follow me"    }}

基本原则:

  • { }表示JSONObject对象
  • [ ]表示JSONArray对象

数据分析:
    那么我们如何去解析呢?首先这段数据中,有一个data字段,里面包含了3个关于data的属性信息。
    我们首先分析一下,整个数据被{ }包住的,所以整个数据是一个JSONObject对象。

解析步骤:

  1. 实例化一个JSONObject对象,把获得数据作为参数带进去。
  2. 使用obj.getXXX方法取得对应的值,例如:getInt,getString,getJSONObject等

    public void Jsonpra(){        String Jsondata ="{\"data\":{\"title\":\"How to get JOSN data\",\"author\":\"Zergen\",\"content\":\"Please follow me\"}}";        try {            JSONObject obj = new JSONObject(Jsondata); //实例化JSONObject对象,并参入参数:JSON对象数据            JSONObject data = obj.getJSONObject("data"); //data对应的值是一个JSONObject对象            String title = data.getString("title");            String author = data.getString("author");            String content = data.getString("content");            Log.e("TAG", "标题是:" + title + " " + "作者是:" + author + " " + "内容是:" + content);        } catch (JSONException e) {            e.printStackTrace();        }    }

运行结果如下:

E/TAG: 标题是:How to get JOSN data 作者是:Zergen 内容是:Please follow me


JSONArray对象解析

还是先看一下我们即将解析的数据:

{    "data":[        {            "title":"How to get JOSN data",            "author":"Zergen",            "content":"Please follow me"        },        {            "title":"What is JSON?",            "author":"Mark",            "content":"JSON just is a kind of data format "        }    ]}

数据分析:
    因为data对应的值用[ ]包住的,所以这个时候data字段对应的值不再是个JSONObject对象了,而是一个JSONArray数组对象了。其实解法与解析JSONObject对象是一个道理,只不过多了一步遍历数组的步骤。

       public void JsonArraypra(){        String jsondata = "{\"data\":[{ \"title\":\"How to get JOSN data\",\"author\":\"Zergen\",\"content\":\"Please follow me\"},{\"title\":\"What is JSON?\",\"author\":\"Mark\",\"content\":\"JSON just is a kind of data format \"}]}";        try {            JSONObject obj = new JSONObject(jsondata);            JSONArray data= obj.getJSONArray("data"); //获取data对应的JsonArray对象            for (int i = 0;i<data.length();i++){ //遍历数组                JSONObject TempObj = data.getJSONObject(i); //参数为索引值                String title = TempObj.getString("title");                Log.e("TAG", "第"+(i+1)+"个标题是:"+title);            }        } catch (JSONException e) {            e.printStackTrace();        }    }

运行结果如下:

E/TAG: 第1个标题是:How to get JOSN dataE/TAG: 第2个标题是:What is JSON?


如上我们讲解了如何使用原生的代码来解析JSON数据,但是往往在开发中,这样的效率未免太低了,所以我们常常会用到第三方快捷解析JSON的框架,本篇博客将会介绍GSON框架的简单使用。

GSON框架解析

Gson解析是google 提供的快速Json的第三方框架 。Gson与原生相比最大的优点就在于可以按照bean类对数据进行解析。
要想使用Gson需要自己手动导入jar包,此处不再赘述导入方法了。

Gson解析JSONObject对象

我们还是使用和之前一样的数据,以便于对比两种不同的解析方法:

{    "data":{        "title":"How to get JOSN data",        "author":"Zergen",        "content":"Please follow me"    }}

解析步骤:

  1. 定义一个实体类,类名随意,但是请注意:类中成员变量名要和json数据中字段完全一致。
  2. 实例化Gson对象。调用对象中fromjson方法,根据不同的情况填写参数,详情看下面的解析代码:

    首先定义个实体类,名字为Essay

public class Essay {    private String title;    private String author;    private String content;    }

这里只是写出了类里面定义的对应json数据里面的成员,还需要写出类的构造函数和对应的set、get方法。

public void gsonpra(){        String Jsondata ="{\"data\":{\"title\":\"How to get JOSN data\",\"author\":\"Zergen\",\"content\":\"Please follow me\"}}";        try {            JSONObject obj = new JSONObject(Jsondata);              String GsonData = obj.getString("data"); //把data对应的JSONObject对象当做字符串拿出来            Gson gson = new Gson();            Essay e = gson.fromJson(GsonData, Essay.class); //参数一:需要解析的数据(String) 参数二:class<T> 决定函数返回的类型            Log.e("TAG", "GSON解析:"+"标题是:" + e.getTitle() + " " + "作者是:" + e.getAuthor() + " " + "内容是:" + e.getContent());        } catch (JSONException e) {            e.printStackTrace();        }    }

运行结果如下:

E/TAG: GSON解析:标题是:How to get JOSN data 作者是:Zergen 内容是:Please follow me

关键方法为fromJson,该方法第一个参数为需要解析的json数据,第二个参数为需要解析成的目标对象的class。

Gson解析JSONArray对象

我们还是使用和之前一样的数据:

{    "data":[        {            "title":"How to get JOSN data",            "author":"Zergen",            "content":"Please follow me"        },        {            "title":"What is JSON?",            "author":"Mark",            "content":"JSON just is a kind of data format "        }    ]}

和解析JSONObject对象一样的,首先定义个实体类,名字为Essay

public class Essay {    private String title;    private String author;    private String content;    }

需要注意的是,解析JSONArray数组对象所使用的fromjson方法的第二个参数需要是type类型的参数,此参数获取比较麻烦,直接上代码吧:

  public void gsonarray(){        String jsondata = "{\"data\":[{ \"title\":\"How to get JOSN data\",\"author\":\"Zergen\",\"content\":\"Please follow me\"},{\"title\":\"What is JSON?\",\"author\":\"Mark\",\"content\":\"JSON just is a kind of data format \"}]}";        try {            JSONObject obj = new JSONObject(jsondata);            String GsonData = obj.getString("data");            Gson gson = new Gson();            Type type = new TypeToken<ArrayList<Essay>>(){}.getType();  //通过TypeToken中间类来获取Essay的Type           ArrayList<Essay> essays =  gson.fromJson(GsonData, type);    //type决定函数返回值的type            for (int i =0;i<essays.size();i++){                Essay e = essays.get(i);                Log.e("TAG", "GSON解析数组:" + "第" + (i + 1) + "个标题是:" + e.getTitle());            }        } catch (JSONException e) {            e.printStackTrace();        }    }

运行结果如下:

E/TAG: GSON解析数组:第1个标题是:How to get JOSN dataE/TAG: GSON解析数组:第2个标题是:What is JSON?

如上我们讲解了如何使用Gson框架来解析JSON数据

总结

其实除了Gson还有许多第三方解析JSON数据的框架,比如阿里巴巴的fastJson,以后如果有机会的话,我也会把此框架的使用方法更新在这里

阅读全文
0 0
原创粉丝点击