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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36407875/article/details/78502507

什么是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 data
E/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 data
E/TAG: GSON解析数组:第2个标题是:What is JSON?

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

总结

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

猜你喜欢

转载自blog.csdn.net/qq_36407875/article/details/78502507