Gson的详细使用(android必备,快速提高开发效率)

Gson的详细使用(android必备,快速提高开发效率)

接下来我要强烈给大家推荐一个google官方推荐使用的json解析库Gson。掌握好它之后,在以后的开发中就会减少非常多的代码,使用起来非常的方便。

概述:

Gson是一个Java库,它不仅可以把Java对象转化为Json格式,它也能将一段Json格式的字符串转化为相对于的Java对象。Gson适用于所有Java对象,即使是那些你不知道源代码的对象。

Gson的目标

  1. 提供简单易用的方法比如 toString() ,构造方法来转化JAVA为JSON以及反转化。
  2. 提供已村子的不可修改对象转化为JSON以及反转化。
  3. 提供对象的惯例表示
  4. 支持任意的复杂对象
  5. 生成健壮 可读的JSON输入

通过官方的一些说明,可以看出Gson是非常优秀的json解析和转化的工具。总结一句话就是:方便快捷强大。

讲了这么多它的好处,那么就开始教大家怎样在自己的项目中使用。

第一步:怎样添加gson库

1、首先,在自己的android studio的项目中把gson库添加进来,右键 app 选择open module settings,

2、选择app,然后点击 Dependencies,在点击3步中的Library dependency(依赖的库)

3、在1所指的弹出的收索框中收索gson,然后点击2 所指的收索,然后下面就会出现最新的gson库,点击OK

4、点击上图OK后,gson库就出现在了dependency中了,这个时候还得点击 2所指的OK(确认)按钮。

5、最后查看build.gradle中看看gson库有没有添加成功,如下图2所指的地方,现在可以看到google官方的gson库就添加到了项目中来。接下来就可以在代码中使用gson了。恭喜你终于可以减少繁琐的json解析代码了。

第二步:怎样使用gson库

上面详细讲解了怎样在自己的项目中添加依赖库的方法,并且成功添加了gson库,接下来就讲讲怎样详细的使用。

第一种情况:把Java对象转化为Json格式

       首先建一个实体类,命名为Child如下:

<pre class="java" name="code">package com.world.hello.gsonexample;

import java.util.ArrayList;
import java.util.HashMap;

/**
 * 小孩实体类
 * Created by chengguo on 2016/3/21.
 */
public class Child {
    private int id;
    private String name;
    private String sex;
    private int age;
    //儿童玩具
    private ArrayList<String> toys;
    //儿童玩具的map
    private HashMap<String, String> toysMap = new HashMap<String, String>();
    //小孩的书籍
    private ArrayList<Book> books = new ArrayList<Book>();

    public ArrayList<Book> getBooks() {
        return books;
    }

    public void setBooks(ArrayList<Book> books) {
        this.books = books;
    }

    public HashMap<String, String> getToysMap() {
        return toysMap;
    }

    public void setToysMap(HashMap<String, String> toysMap) {
        this.toysMap = toysMap;
    }

    public ArrayList<String> getToys() {
        return toys;
    }

    public void setToys(ArrayList<String> toys) {
        this.toys = toys;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
package com.world.hello.gsonexample;

/**
 * 书实体类
 * Created by chengguo on 2016/3/21.
 */
public class Book {
    private String name;
    private String price;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }
}

其中child类中包含有 基本数据类型、基本类型的List集合、基本类型的map集合、包含有对象类型的List集合。相信这么多中数据类型,基本都能展示出它相应的处理功能。接下来就是添加数据的java代码,如下:

package com.world.hello.gsonexample;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Gson gson = new Gson();

        Child child = new Child();
        child.setId(1);
        child.setAge(10);
        child.setName("小孩A");
        child.setSex("男");

        ArrayList<String> toys = new ArrayList<String>();
        toys.add("小车");
        toys.add("皮卡丘");
        toys.add("奥特曼");
        toys.add("火影忍者");
        child.setToys(toys);

        HashMap<String, String> toysMap = new HashMap<String, String>();
        toysMap.put("1", "小车2");
        toysMap.put("2", "皮卡丘2");
        toysMap.put("3", "奥特曼2");
        toysMap.put("4", "火影忍者2");
        child.setToysMap(toysMap);

        ArrayList<Book> books = new ArrayList<Book>();
        for (int i = 0; i < 3; i++) {
            Book book = new Book();
            book.setName("格林童话" + i);
            book.setPrice("价格:" + i + "$");
            books.add(book);
        }

        child.setBooks(books);

        Log.i("child", gson.toJson(child));
    }
}

输出结果:

{
    "age": 10,
    "books": [
        {
            "name": "格林童话0",
            "price": "价格:0$"
        },
        {
            "name": "格林童话1",
            "price": "价格:1$"
        },
        {
            "name": "格林童话2",
            "price": "价格:2$"
        }
    ],
    "id": 1,
    "name": "小孩A",
    "sex": "男",
    "toys": [
        "小车",
        "皮卡丘",
        "奥特曼",
        "火影忍者"
    ],
    "toysMap": {
        "1": "小车2",
        "2": "皮卡丘2",
        "3": "奥特曼2",
        "4": "火影忍者2"
    }
}

其实非常的简单,只需要两行代码

Gson gson = new Gson();

gson.toJson(对象);

是不是非常简单呢。

好了上面就是 用gson 将对象转化为json。其中有各种数据类型的包裹,相信能够满足需求。往往都是进行数据提交到服务器的时候才需要将对象转化为json数据格式。

第二种情况:将一段Json格式的字符串转化为相对于的Java对象

   Android开发进行网络数据传输,目前基本都是使用的json数据格式,我们平时的做法都是先看看,后台数据有哪些属性,然后再定义这个类,比如:后台

传了一个 child 的 json 数据,我们看见一个id属性,然后再去child这个类去定义这个id属性,这样做是不是非常的费时呢,现在有gson之后,一切都变得非常的简单。我们看看怎样根据上面 第一种情况生成的 json 反过来快速生成 child 对象。

1、首先,我们根据json数据格式或业务需要,我们定义一个Child2这个实体类。然后右键,点击Generate(快捷键Alt+Insert);

2、然后再点击 GsonFormat (只有项目中成功添加gson库才会有GsonFormat这个选项);

3、然后弹出一个窗口,然后在这个窗口中,把网络获取的json数据粘贴到这个里面,然后点击Ok.

4、然后就是在弹出的新窗口中出现了如下界面,其中可以修改Data Type(数据类型)和  Field name( 属性名称 )。

这里把age改为age2,仅作示范。还有一种情况就是,Value值为 空 (null)时,比如有age这个属性,但是age返回的是 null,你和后台开发人员沟通过后,发现这个age 为 int 类型,你就可以在Data Type这里设置age的数据类型为int。这样就能自己修改属性的数据类型。

点击了OK之后,就自动为我们创建了Child2这个实体类,如下:

package com.world.hello.gsonexample;

import com.google.gson.annotations.SerializedName;

import java.util.List;

/**
 * Created by chengguo on 2016/3/21.
 */
public class Child2  {

    /**
     * age : 10
     * books : [{"name":"格林童话0","price":"价格:0$"},{"name":"格林童话1","price":"价格:1$"},{"name":"格林童话2","price":"价格:2$"}]
     * id : 1
     * name : 小孩A
     * sex : 男
     * toys : ["小车","皮卡丘","奥特曼","火影忍者"]
     * toysMap : {"1":"小车2","2":"皮卡丘2","3":"奥特曼2","4":"火影忍者2"}
     */

    @SerializedName("age")
    private int age2;
    private int id;
    private String name;
    private String sex;
    /**
     * 1 : 小车2
     * 2 : 皮卡丘2
     * 3 : 奥特曼2
     * 4 : 火影忍者2
     */

    private ToysMapBean toysMap;
    /**
     * name : 格林童话0
     * price : 价格:0$
     */

    private List<BooksBean> books;
    private List<String> toys;

    public int getAge2() {
        return age2;
    }

    public void setAge2(int age2) {
        this.age2 = age2;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public ToysMapBean getToysMap() {
        return toysMap;
    }

    public void setToysMap(ToysMapBean toysMap) {
        this.toysMap = toysMap;
    }

    public List<BooksBean> getBooks() {
        return books;
    }

    public void setBooks(List<BooksBean> books) {
        this.books = books;
    }

    public List<String> getToys() {
        return toys;
    }

    public void setToys(List<String> toys) {
        this.toys = toys;
    }

    public static class ToysMapBean {
        @SerializedName("1")
        private String value1;
        @SerializedName("2")
        private String value2;
        @SerializedName("3")
        private String value3;
        @SerializedName("4")
        private String value4;

        public String getValue1() {
            return value1;
        }

        public void setValue1(String value1) {
            this.value1 = value1;
        }

        public String getValue2() {
            return value2;
        }

        public void setValue2(String value2) {
            this.value2 = value2;
        }

        public String getValue3() {
            return value3;
        }

        public void setValue3(String value3) {
            this.value3 = value3;
        }

        public String getValue4() {
            return value4;
        }

        public void setValue4(String value4) {
            this.value4 = value4;
        }
    }

    public static class BooksBean {
        private String name;
        private String price;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public String getPrice() {
            return price;
        }

        public void setPrice(String price) {
            this.price = price;
        }
    }
}

你会发现,gson把内部集合中的对象也创建到了Child2 类里面,这里我们可以将BookBean类手动到外部单独创建,也是非常方便,免去了自己创建的繁琐操作。

上面讲解了怎样根据服务器返回的结果来创建对象。

下面就讲解,怎样使用gson把服务器返回的结果转化为实体对象。

//网络访问成功返回数据的方法 
 public void onResponse(String response) {
              //成功获取网络json数据
             Child2 child2 = gson.fromJson(response, Child2.class);}

只需要一句话就能得到Child2对象,这样就免去了少则几十行,多则成百上千行的json解析代码。上面是获取到一个对象数据,接下来获取list数据。

List<Child2> child2List = gson.fromJson(response, new TypeToken<List<Child2>>(){}.getType());

可以看到上面的代码使用了TypeToken,它是gson提供的数据类型转换器,也是只需要一句代码,就能将json数据转化为list 数据,可以支持各种数据集合类型转换。

注意:当属性值为int型,它在json中的数据为 空 时,gson解析默认为 0;

当属性值为String型,它在json中的数据为 空 时 ,gson解析默认为 字符串“null”;

Gson的基本使用就是这么多了。希望对你的学习有所帮助。

时间: 2024-08-03 19:22:29

Gson的详细使用(android必备,快速提高开发效率)的相关文章

Android Studio添加Parcelable序列化小工具(快速提高开发效率)

Android Studio添加Parcelable序列化小工具(快速提高开发效率) Android Studio是google专门为开发Android提供的开发工具,在它内部可以直接的添加一些非常好用的开发小工具,这里就讲解怎样添加这些小工具,并且向大家推荐一个非常有用的对象传递时,必须要把对象序列化的接口Parcelable小工具; 这里先介绍下 Android中实现序列化的两个选择:一是实现Serializable接口(是JavaSE本身就支持的),一是实现Parcelable接口(是An

提高开发效率的 Eclipse 实用操作

工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分了你的神.而掌握了Eclipse的一些实用技巧,则可以大大提高开发效率. 1.丢掉鼠标吧之Eclipse快捷键篇 1.1文件切换的三种方式 1.1.1  Ctrl + E,在右边显示出当前打开的所有文件 1.1.2 Ctrl + Pg Up ,Ctrl + Pg Dn ,逐个文件跳跃 按下Ctrl

可以500%提高开发效率的前端UI框架!QUI!

QUI 框架介绍 QUI网页界面集成框架是一套完整的企业级前端解决方案,由组件库.皮肤框架.示例工程和文档4部分组成.使用本产品开发者可以极大地减少工作量,提高开发效率,快速构建功能强大.美观.兼容的应用系统. QUI框架特点如下: 特点一: 组件使用方式极大简化和一致性 几乎所有组件都可以通过一句标签实现创建.无需任何JS代码. 例如: 其中,class设置为selectTree声明它是一个树形下拉框,url里的路径用于从远程获取JSON数据. 效果如下: 其他设置通过添加属性实现,例如添加m

Visual Studio 实用扩展推荐   Visual Studio 拥有非常不错的可扩展性,在之前的文章中,我也给大家示范了如何进行编辑器的扩展(详见文末参考资源)。在本篇文章中,我将介绍几款非常实用的扩展,从而帮助我们提高开发效率。 C# outline   Visual Studio 默认的大纲方案只允许在方法级别及以上进行代码的折叠,无法对一个if、while的区块进行折叠

Visual Studio 实用扩展推荐 Visual Studio 拥有非常不错的可扩展性,在之前的文章中,我也给大家示范了如何进行编辑器的扩展(详见文末参考资源).在本篇文章中,我将介绍几款非常实用的扩展,从而帮助我们提高开发效率. C# outline Visual Studio 默认的大纲方案只允许在方法级别及以上进行代码的折叠,无法对一个if.while的区块进行折叠,而这款工具则正好弥补了这个问题. highlight all occurrences of selected word

善用VS中的Code Snippet来提高开发效率

http://www.cnblogs.com/anderslly/archive/2009/02/16/vs2008-code-snippets.html http://www.cnblogs.com/jaic-xiao/archive/2008/10/14/Jie_Shao_Net_Gong_Ju_Code_Snippet_Yu_Sql_Server_2008_Gong_Ju_SSMS_Tools_Pack.html 前言 在谈谈VS中的模板中,我介绍了如何创建项目/项模板,这种方式可以在创建

如何利用 Visual Studio 自带工具提高开发效率

原文:如何利用 Visual Studio 自带工具提高开发效率 Visual Stuido 是一款强大的Windows 平台集成开发工具,你是否好好地利用了它呢? 显示行号 有些时候(比如错误定位)的时候,显示行号将有利于我们进行快速定位. 如何显示 1. 工具 / 选项 / 文本编辑器 -> 选择对应的语言 2. 勾选 "行号" 使用书签 和平常意义的书签类似,当我们希望在日后某一时刻快速定位到一处代码时使用.比如在项目例会上,你需要演示本周你所做的一些改进,在开会前可以事先

“六神”——技术提高开发效率的一个方案

这个方案并不是我在系统设计方面的最早一次尝试.但它在提高开发效率方面,是效果最为显著的一个方案. 简介 "六神"框架提供了一套简单而通用的.从Web层到数据库操作(增加单个数据.删除单个数据.修改单个数据.查询单个数据.查分页列表.查不分页列表,六个操作,因此名为"六神")的基础组件.并且,它为复杂的数据库操作留下了扩展点. 在当时的技术背景下,这套框架使用Struts2.0+Spring+myBatis来实现.但是它的设计思路是可以适用于其它技术的. 在应用了这套

能够提高开发效率的 Eclipse 实用操作

工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分了你的神.而掌握了Eclipse的一些实用技巧,则可以大大提高开发效率. 1.丢掉鼠标吧之Eclipse快捷键篇 1.1文件切换的三种方式 1.1.1  Ctrl + E,在右边显示出当前打开的所有文件 1.1.2 Ctrl + Pg Up ,Ctrl + Pg Dn ,逐个文件跳跃 按下Ctrl

能够提高开发效率的Eclipse实用操作

工欲善其事,必先利其器.对于程序员来说,Eclipse便是其中的一个“器”.本文会从Eclipse快捷键和实用技巧这两个篇章展开介绍.Eclipse快捷键用熟后,不用鼠标,便可进行编程开发,避免鼠标分了你的神.而掌握了Eclipse的一些实用技巧,则可以大大提高开发效率. 1.丢掉鼠标吧之Eclipse快捷键篇 1.1文件切换的三种方式 1.1.1  Ctrl + E,在右边显示出当前打开的所有文件 1.1.2 Ctrl + Pg Up ,Ctrl + Pg Dn ,逐个文件跳跃 按下Ctrl