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

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



       概述:
              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如下:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. <pre class="java" name="code">package com.world.hello.gsonexample;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5.   
  6. /** 
  7.  * 小孩实体类 
  8.  * Created by chengguo on 2016/3/21. 
  9.  */  
  10. public class Child {  
  11.     private int id;  
  12.     private String name;  
  13.     private String sex;  
  14.     private int age;  
  15.     //儿童玩具  
  16.     private ArrayList<String> toys;  
  17.     //儿童玩具的map  
  18.     private HashMap<String, String> toysMap = new HashMap<String, String>();  
  19.     //小孩的书籍  
  20.     private ArrayList<Book> books = new ArrayList<Book>();  
  21.   
  22.     public ArrayList<Book> getBooks() {  
  23.         return books;  
  24.     }  
  25.   
  26.     public void setBooks(ArrayList<Book> books) {  
  27.         this.books = books;  
  28.     }  
  29.   
  30.     public HashMap<String, String> getToysMap() {  
  31.         return toysMap;  
  32.     }  
  33.   
  34.     public void setToysMap(HashMap<String, String> toysMap) {  
  35.         this.toysMap = toysMap;  
  36.     }  
  37.   
  38.     public ArrayList<String> getToys() {  
  39.         return toys;  
  40.     }  
  41.   
  42.     public void setToys(ArrayList<String> toys) {  
  43.         this.toys = toys;  
  44.     }  
  45.   
  46.     public int getId() {  
  47.         return id;  
  48.     }  
  49.   
  50.     public void setId(int id) {  
  51.         this.id = id;  
  52.     }  
  53.   
  54.     public String getName() {  
  55.         return name;  
  56.     }  
  57.   
  58.     public void setName(String name) {  
  59.         this.name = name;  
  60.     }  
  61.   
  62.     public String getSex() {  
  63.         return sex;  
  64.     }  
  65.   
  66.     public void setSex(String sex) {  
  67.         this.sex = sex;  
  68.     }  
  69.   
  70.     public int getAge() {  
  71.         return age;  
  72.     }  
  73.   
  74.     public void setAge(int age) {  
  75.         this.age = age;  
  76.     }  
  77. }  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.world.hello.gsonexample;  
  2.   
  3. /** 
  4.  * 书实体类 
  5.  * Created by chengguo on 2016/3/21. 
  6.  */  
  7. public class Book {  
  8.     private String name;  
  9.     private String price;  
  10.   
  11.     public String getName() {  
  12.         return name;  
  13.     }  
  14.   
  15.     public void setName(String name) {  
  16.         this.name = name;  
  17.     }  
  18.   
  19.     public String getPrice() {  
  20.         return price;  
  21.     }  
  22.   
  23.     public void setPrice(String price) {  
  24.         this.price = price;  
  25.     }  
  26. }  
 
  其中child类中包含有 基本数据类型、基本类型的List集合、基本类型的map集合、包含有对象类型的List集合。相信这么多中数据类型,基本都能展示出它相应的处理功能。接下来就是添加数据的java代码,如下:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.world.hello.gsonexample;  
  2.   
  3. import android.os.Bundle;  
  4. import android.support.v7.app.AppCompatActivity;  
  5. import android.util.Log;  
  6.   
  7. import com.google.gson.Gson;  
  8.   
  9. import java.util.ArrayList;  
  10. import java.util.HashMap;  
  11.   
  12. public class MainActivity extends AppCompatActivity {  
  13.   
  14.     @Override  
  15.     protected void onCreate(Bundle savedInstanceState) {  
  16.         super.onCreate(savedInstanceState);  
  17.         setContentView(R.layout.activity_main);  
  18.   
  19.         Gson gson = new Gson();  
  20.   
  21.         Child child = new Child();  
  22.         child.setId(1);  
  23.         child.setAge(10);  
  24.         child.setName("小孩A");  
  25.         child.setSex("男");  
  26.   
  27.         ArrayList<String> toys = new ArrayList<String>();  
  28.         toys.add("小车");  
  29.         toys.add("皮卡丘");  
  30.         toys.add("奥特曼");  
  31.         toys.add("火影忍者");  
  32.         child.setToys(toys);  
  33.   
  34.         HashMap<String, String> toysMap = new HashMap<String, String>();  
  35.         toysMap.put("1""小车2");  
  36.         toysMap.put("2""皮卡丘2");  
  37.         toysMap.put("3""奥特曼2");  
  38.         toysMap.put("4""火影忍者2");  
  39.         child.setToysMap(toysMap);  
  40.   
  41.         ArrayList<Book> books = new ArrayList<Book>();  
  42.         for (int i = 0; i < 3; i++) {  
  43.             Book book = new Book();  
  44.             book.setName("格林童话" + i);  
  45.             book.setPrice("价格:" + i + "$");  
  46.             books.add(book);  
  47.         }  
  48.   
  49.         child.setBooks(books);  
  50.   
  51.         Log.i("child", gson.toJson(child));  
  52.     }  
  53. }  
输出结果:
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. {  
  2.     "age"10,  
  3.     "books": [  
  4.         {  
  5.             "name""格林童话0",  
  6.             "price""价格:0$"  
  7.         },  
  8.         {  
  9.             "name""格林童话1",  
  10.             "price""价格:1$"  
  11.         },  
  12.         {  
  13.             "name""格林童话2",  
  14.             "price""价格:2$"  
  15.         }  
  16.     ],  
  17.     "id"1,  
  18.     "name""小孩A",  
  19.     "sex""男",  
  20.     "toys": [  
  21.         "小车",  
  22.         "皮卡丘",  
  23.         "奥特曼",  
  24.         "火影忍者"  
  25.     ],  
  26.     "toysMap": {  
  27.         "1""小车2",  
  28.         "2""皮卡丘2",  
  29.         "3""奥特曼2",  
  30.         "4""火影忍者2"  
  31.     }  
  32. }  
    其实非常的简单,只需要两行代码

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这个实体类,如下:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.world.hello.gsonexample;  
  2.   
  3. import com.google.gson.annotations.SerializedName;  
  4.   
  5. import java.util.List;  
  6.   
  7. /** 
  8.  * Created by chengguo on 2016/3/21. 
  9.  */  
  10. public class Child2  {  
  11.   
  12.   
  13.     /** 
  14.      * age : 10 
  15.      * books : [{"name":"格林童话0","price":"价格:0$"},{"name":"格林童话1","price":"价格:1$"},{"name":"格林童话2","price":"价格:2$"}] 
  16.      * id : 1 
  17.      * name : 小孩A 
  18.      * sex : 男 
  19.      * toys : ["小车","皮卡丘","奥特曼","火影忍者"] 
  20.      * toysMap : {"1":"小车2","2":"皮卡丘2","3":"奥特曼2","4":"火影忍者2"} 
  21.      */  
  22.   
  23.     @SerializedName("age")  
  24.     private int age2;  
  25.     private int id;  
  26.     private String name;  
  27.     private String sex;  
  28.     /** 
  29.      * 1 : 小车2 
  30.      * 2 : 皮卡丘2 
  31.      * 3 : 奥特曼2 
  32.      * 4 : 火影忍者2 
  33.      */  
  34.   
  35.     private ToysMapBean toysMap;  
  36.     /** 
  37.      * name : 格林童话0 
  38.      * price : 价格:0$ 
  39.      */  
  40.   
  41.     private List<BooksBean> books;  
  42.     private List<String> toys;  
  43.   
  44.     public int getAge2() {  
  45.         return age2;  
  46.     }  
  47.   
  48.     public void setAge2(int age2) {  
  49.         this.age2 = age2;  
  50.     }  
  51.   
  52.     public int getId() {  
  53.         return id;  
  54.     }  
  55.   
  56.     public void setId(int id) {  
  57.         this.id = id;  
  58.     }  
  59.   
  60.     public String getName() {  
  61.         return name;  
  62.     }  
  63.   
  64.     public void setName(String name) {  
  65.         this.name = name;  
  66.     }  
  67.   
  68.     public String getSex() {  
  69.         return sex;  
  70.     }  
  71.   
  72.     public void setSex(String sex) {  
  73.         this.sex = sex;  
  74.     }  
  75.   
  76.     public ToysMapBean getToysMap() {  
  77.         return toysMap;  
  78.     }  
  79.   
  80.     public void setToysMap(ToysMapBean toysMap) {  
  81.         this.toysMap = toysMap;  
  82.     }  
  83.   
  84.     public List<BooksBean> getBooks() {  
  85.         return books;  
  86.     }  
  87.   
  88.     public void setBooks(List<BooksBean> books) {  
  89.         this.books = books;  
  90.     }  
  91.   
  92.     public List<String> getToys() {  
  93.         return toys;  
  94.     }  
  95.   
  96.     public void setToys(List<String> toys) {  
  97.         this.toys = toys;  
  98.     }  
  99.   
  100.     public static class ToysMapBean {  
  101.         @SerializedName("1")  
  102.         private String value1;  
  103.         @SerializedName("2")  
  104.         private String value2;  
  105.         @SerializedName("3")  
  106.         private String value3;  
  107.         @SerializedName("4")  
  108.         private String value4;  
  109.   
  110.         public String getValue1() {  
  111.             return value1;  
  112.         }  
  113.   
  114.         public void setValue1(String value1) {  
  115.             this.value1 = value1;  
  116.         }  
  117.   
  118.         public String getValue2() {  
  119.             return value2;  
  120.         }  
  121.   
  122.         public void setValue2(String value2) {  
  123.             this.value2 = value2;  
  124.         }  
  125.   
  126.         public String getValue3() {  
  127.             return value3;  
  128.         }  
  129.   
  130.         public void setValue3(String value3) {  
  131.             this.value3 = value3;  
  132.         }  
  133.   
  134.         public String getValue4() {  
  135.             return value4;  
  136.         }  
  137.   
  138.         public void setValue4(String value4) {  
  139.             this.value4 = value4;  
  140.         }  
  141.     }  
  142.   
  143.     public static class BooksBean {  
  144.         private String name;  
  145.         private String price;  
  146.   
  147.         public String getName() {  
  148.             return name;  
  149.         }  
  150.   
  151.         public void setName(String name) {  
  152.             this.name = name;  
  153.         }  
  154.   
  155.         public String getPrice() {  
  156.             return price;  
  157.         }  
  158.   
  159.         public void setPrice(String price) {  
  160.             this.price = price;  
  161.         }  
  162.     }  
  163. }  

       你会发现,gson把内部集合中的对象也创建到了Child2 类里面,这里我们可以将BookBean类手动到外部单独创建,也是非常方便,免去了自己创建的繁琐操作。
      
上面讲解了怎样根据服务器返回的结果来创建对象。
下面就讲解,怎样使用gson把服务器返回的结果转化为实体对象。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //网络访问成功返回数据的方法   
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public void onResponse(String response) {  
  2.              //成功获取网络json数据  
  3.             Child2 child2 = gson.fromJson(response, Child2.class);}  
[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. </pre>只需要一句话就能得到Child2对象,这样就免去了少则几十行,多则成百上千行的json解析代码。上面是获取到一个对象数据,接下来获取list数据。</div><div></div><span style="font-size:14px"></span><pre class="java" snippet_file_name="blog_20160321_9_2451010" code_snippet_id="1618092" name="code">List<Child2> child2List = gson.fromJson(response, new TypeToken<List<Child2>>(){}.getType());  


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

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

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

 

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值