Gson解析

前言:迷茫,本就是青春该有的样子 ,但不要让未来的你,讨厌现在的自己

json:一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。

Android交互数据主要有两种方式:Json和Xml,Xml格式的数据量要比Json格式略大,为了节省流量,减轻服务器压力,目前绝大多数公司都使用Json交互。

目录

1:使用原生方式解析Json] (使用原生方式解析Json)
2:Gson框架的使用] (Gson框架的使用)
3:插件GsonFormat快速实现JavaBean (插件GsonFormat快速实现JavaBean)

一、使用原生方式解析Json

Json主要通过"{ }" 和 "[ ]" 包裹数据,"{ }"里面存放key-value键值对, "[ ]" 里存放数组。
标准的Json格式key必须用双引号。 下面都是Json:

 {"name" : "jack", "age" : 10}

 {"names" : ["jack", "rose", "jim"]}

 [{"name" : "jack", "age" : 10},{"name" : "rose", "age" : 11}]

要想从JSON中挖掘出具体数据,得对JSON进行解析。分别来看看三个不同的Json是如何解析的:

public void parseJson1(){
        String json1="{\"name\" : \"jack\", \"age\" : 10}";
        try {
            //把要解析的json通过构造方法告诉JSONObject
            JSONObject jsonObject=new JSONObject(json1);
            // 获取name
            String name=jsonObject.getString("name");
            int age=jsonObject.getInt("age");
            Log.i("ParserJsonActivity","name:"+name);
            Log.i("ParserJsonActivity","age:"+age);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public void parseJson2(){
        String json2="{\"names\" : [\"jack\", \"rose\", \"jim\"]}";
        try {
            //把要解析的json通过构造方法告诉JSONObject
            JSONObject jsonObject=new JSONObject(json2);
            //names对应的 JsonArray
            JSONArray jsonArray=jsonObject.getJSONArray("names");
            //遍历JSONArray
            for(int i=0;i<jsonArray.length();i++){
                Log.i("ParserJsonActivity","name"+i+":"+jsonArray.getString(i));
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    public void parseJson3(){
        String json3="[{\"name\" : \"jack\", \"age\" : 10},{\"name\" : \"rose\", \"age\" : 11}]";
        try {
            //把要解析的json通过构造方法告诉JSONArray
            JSONArray jsonArray=new JSONArray(json3);
            //遍历JSONArray
            for(int i=0;i<jsonArray.length();i++){
                //根据i的位置获取JSONObject
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String name = jsonObject.getString("name");
                int age=jsonObject.getInt("age");
                Log.i("ParserJsonActivity","name"+i+":"+name);
                Log.i("ParserJsonActivity","age"+i+":"+age);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

上面的代码,主要使用了JSONObject和JSONArray。

当碰到 “{ }”时用JSONObject解析,遇到“[ ]”时用JSONArray解析。

想要的数据全部都获取到了。

二 、Gson框架的使用

如果你认为使用JSONObject和JSONArray来解析JSON数据已经非常简单了,那你就容易太满足了。早就有框架可以使用了。

常见的框架有 Gson,FastJSON等等,他们都各有优缺点,但是总体区别不大。

GSON方式

  • 原理:基于事件驱动

  • 优点:解析方法简单、解析效率高、占存少、灵活性高

  • 使用情境:适用于需要处理大型 JSON文档、JSON文档结构复杂的场合

Jackson方式

  • 原理:基于事件驱动

  • 优点:解析效率最高、在数据量大的情况优势尤为明显、占存少

  • 缺点:必须完全解析文档,如果要按需解析的话可以拆分Json来读取,操作和解析方法复杂;

  • 使用情境: 适用于需要处理超大型JSON文档、不需要对JSON文档进行按需解析、性能要求较高的场合

我一直用GSON方式解析,使用起来比较简单。

首先在app/build.gradle中添加依赖。

dependencies {
    ...
    compile 'com.google.code.gson:gson:2.6.2'
}

Gson是基于事件驱动,根据所需要取的数据通过建立一个对应于JSON数据的JavaBean类就可以通过简单的操作解析出所需JSON数据。

步骤1:创建一个与JSON数据对应的JavaBean类(用作存储需要解析的数据)

GSON解析的关键是重点是要根据json数据里面的结构写出一个对应的javaBean,规则是:

  • JSON的大括号对应一个对象,对象里面有key和value(值)。在JavaBean里面的类属性要和key同名;

  • JSON的方括号对应一个数组,所以在JavaBeanBean里面对应的也是数组或者集合,数据里面可以有值或者对象;

  • 如果数组里面只有值没有key,就说明它只是一个纯数组,如果里面有值有key,则说明是对象数组。纯数组对应JavaBean里面的数组类型,对象数组要在Bean里面建立一个内部类,类属性就是对应的对象里面的key,建立了之后要创建一个这个内部类的对象,名字对应数组名;

  • 对象里面嵌套对象时候,也要建立一个内部类,和对象数组一样,这个内部类对象的名字就是父对象的key。

注意:JavaBean类里的属性不一定要全部和JSON数据里的所有key相同,可以按需取数据,也就是你想要哪种数据,就把对应的key属性写出来,注意名字一定要对应。

接下来,我们来看下下面两条JSON数据按照上面的规则应该何如生成JavaBean对象。

{"name" : "jack", "age" : 10}

{"names" : ["jack", "rose", "jim"]}

第一个:

/**
 * {"name" : "jack", "age" : 10}
 */
public class Person1 {
    private String name;
    private int age;

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

第二个:

/**
 * {"names" : ["jack", "rose", "jim"]}
 */
public class Person2 {

    private List<String> names;

    public List<String> getNames() {
        return names;
    }

    public void setNames(List<String> names) {
        this.names = names;
    }
}

再来看看使用如何Gson解析:

主要方法为:fromJson()

public  void  useGsonParser1(){
    String json1="{\"name\" : \"jack\", \"age\" : 10}";
    Gson gson=new Gson();
    //把json数据解析成Person1对象
    Person1 person1 = gson.fromJson(json1, Person1.class);
    Log.i("UseGsonActivity","name:"+person1.getName());
    Log.i("UseGsonActivity","age:"+person1.getAge());
}
public  void  useGsonParser2(){
    String json2="{\"names\" : [\"jack\", \"rose\", \"jim\"]}";
    Gson gson=new Gson();
    Person2 person2=gson.fromJson(json2,Person2.class);
    List<String> names = person2.getNames();
    for(int i=0;i<names.size();i++){
        Log.i("UseGsonActivity","name"+i+":"+names.get(i));
    }
}

细心的同学会发现,之前使用JSONObject和JSONArray解析了3条数据,而我们并没有使用GSON解析最后一条。

[{"name" : "jack", "age" : 10},{"name" : "rose", "age" : 11}]

最后一条比较特殊,是以"[ ]"开头,我们知道因为大括号{ } 代表的是对象,中括号[]代表的是集合或者数组,所以javaBean直接使用Person1就行了,只不过返回的是一个集合或者数组。我们需要借助TypeToken,具体代码如下:

public  void useGsonParser3(){
    String json3="[{\"name\" : \"jack\", \"age\" : 10},{\"name\" : \"rose\", \"age\" : 11}]";
    Gson gson=new Gson();
    List<Person1> person2=gson.fromJson(json3,new TypeToken<ArrayList<Person1>>(){}.getType());
    for(int i=0;i<person2.size();i++){
        //根据i的位置获取JSONObject
        Person1 person1 = person2.get(i);
        String name = person1.getName();
        int age=person1.getAge();
        Log.i("UseGsonActivity","name"+i+":"+name);
        Log.i("UseGsonActivity","age"+i+":"+age);
    }
}

想要的数据依然全部都获取到了。

上面的Gson介绍,基本上可以满足绝大多数的开发需求。

三 、插件GsonFormat快速实现JavaBean

上面我们介绍了,使用Gson开源库解析JSON数据,大家可能会发现虽然解析代码比较简单,但是还需要自己按照规则写一个javaBean。

好消息来了,通过AndroidStudio插件,你甚至不需要再手动写JavaBean了,让你立刻完成~

1132780-6b126326be8d487b.png

GsonFormat 插件安装
重启完了,接下来就是见证奇迹的时刻了。
我们以下面的JSON为例,让大家看看如何快速生成JavaBean:

{
  "showapi_res_code": 0,
  "showapi_res_error": "",
  "showapi_res_body": {
    "areaCode": "0871",
    "city": "昆明",
    "name": "中国电信",
    "num": 1890871,
    "postCode": "650000",
    "prov": "云南",
    "provCode": "530000",
    "ret_code": 0,
    "type": 2
  }
}
1132780-bb62ef773924162e.png

使用方式,在实体类中使用Generate的快捷键。默认快捷键 alt+Insert。

1132780-77611854c40f8377.png
1132780-69eef520dad1dd3b.gif

好,Gson的解析和GsonFormat自动生成实体类就介绍到这里了,是不是有种 "柳暗花明又一村"的感觉。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容