Gson的详细使用(android必备,快速提高开发效率)
Posted 柒号公园
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gson的详细使用(android必备,快速提高开发效率)相关的知识,希望对你有一定的参考价值。
Gson的详细使用(android必备,快速提高开发效率)
接下来我要强烈给大家推荐一个google官方推荐使用的json解析库Gson。掌握好它之后,在以后的开发中就会减少非常多的代码,使用起来非常的方便。
概述:
Gson是一个Java库,它不仅可以把Java对象转化为Json格式,它也能将一段Json格式的字符串转化为相对于的Java对象。Gson适用于所有Java对象,即使是那些你不知道源代码的对象。
Gson的目标
- 提供简单易用的方法比如 toString() ,构造方法来转化JAVA为JSON以及反转化。
- 提供已村子的不可修改对象转化为JSON以及反转化。
- 提供对象的惯例表示
- 支持任意的复杂对象
- 生成健壮 可读的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的基本使用就是这么多了。希望对你的学习有所帮助。
以上是关于Gson的详细使用(android必备,快速提高开发效率)的主要内容,如果未能解决你的问题,请参考以下文章
Android Gson使用入门及GsonFormat插件的使用
Android Gson使用入门及GsonFormat插件的使用
Android Gson使用入门及GsonFormat插件的使用