Json转换神器之Google Gson的使用

简介:

这几天,因为项目的需要,接触了Google的Gson库,发现这个东西很好用,遂记下简单的笔记,供以后参考。至于Gson是干什么的,有什么优点,请各位同学自行百度。话不多说,切入正题:

1. 下载Gson的jar包,拷贝到项目的lib文件夹中,并将其加入到buildPath中。使用maven的同学,直接在pom中加入以下依赖即可:

?
1
2
3
4
5
< dependency >
  < groupId >com.google.code.gson</ groupId >
  < artifactId >gson</ artifactId >
  < version >2.2.4</ version >
</ dependency >

2. 编写实体类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public  class  People {
  String name;
   int  age;
   boolean  setName;
   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;
  }
   public  boolean  getSetName() {
     return  setName;
  }
   public  void  setSetName( boolean  setName) {
     this .setName = setName;
  }
   @Override
   public  String toString() {
     return  "name="  + name +  " age="  + age +  " setName="  +setName;
  }
}

3. 编写测试类GsonTest

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import  com.google.gson.ExclusionStrategy;
import  com.google.gson.FieldAttributes;
import  com.google.gson.Gson;
import  com.google.gson.GsonBuilder;
/**
  * Convert java object to json.
  */
public  class  GsonTest {
   public  static  void  main(String[] args) {
    People p =  new  People();
    p.setAge( 20 );
    p.setName( "People" );
    p.setSetName( true );
    Gson gson =  new  Gson();
    System.out.println(gson.toJson(p));
  }
}

4. 输出结果:

?
1
{ "name" : "People" , "age" : 20 , "setName" : true }

5. 这只是最简单的Gson的使用。如果我们需要将bool类型的属性setName在转换成json的时候不转换,怎么实现呢? 

  在Gson的包中找半天,发现com.google.gson包下面有这么一个接口:ExclusionStrategy ,虽然不清楚是干什么的,但是根据名字,可以推断,这个接口是用来设置Gson转换的排除策略的,于是在官网http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html查了一下这个接口,发现只要实现这个接口,并将实现类的对象塞给Gson,在转换成json的时候,Gson就会过滤掉指定的类或者属性。于是有了下面的代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import  com.google.gson.ExclusionStrategy;
import  com.google.gson.FieldAttributes;
import  com.google.gson.Gson;
import  com.google.gson.GsonBuilder;
/**
 * Convert java object to json, skip specific fileds.
 */
public  class  GsonTest {
   public  static  void  main(String[] args) {
    People p =  new  People();
    p.setAge( 20 );
    p.setName( "People" );
    p.setSetName( true );
    ExclusionStrategy excludeStrategy =  new  SetterExclusionStrategy();
    Gson gson1 =  new  GsonBuilder()
      .setExclusionStrategies(excludeStrategy)
      .create();
    Gson gson2 =  new  Gson();
    String json1 = gson1.toJson(p);
    String json2 = gson2.toJson(p);
    System.out.println(json1);
    System.out.println(json2);
 
    People p1 = gson1.fromJson(json1, People. class );
    People p2 = gson2.fromJson(json2, People. class );
    System.out.println(p1);
    System.out.println(p2);
  }
 
   private  static  class  SetterExclusionStrategy  implements  ExclusionStrategy {
     public  boolean  shouldSkipClass(Class<?> clazz) {
       return  false ;
    }
     public  boolean  shouldSkipField(FieldAttributes f) {
       return  f.getName().startsWith( "set" );
    }
  }
}

  原来,Gson对象的创建有两种方式:new Gson()表示使用默认的配置创建一个Gson对象,而如果使用GsonBuilder.create()方法创建,则可以自定义一些设置,这主要是为了使创建的Gson更适合于某些特定的情况。上例中第一段蓝色的代码创建了一个Gson对象,这个对象拥有对以“set”字样开头的属性的过滤的配置(如果需要过滤掉某种类型,则重写ExclusionStrategy接口的shouldSkipClass(Class<?> clazz)方法即可,如果需要过滤掉多种情况,则可以多创建几个ExclusionStrategy的实现类对象,并在创建Gson对象的时候设置进去即可),因此在本例中,将People对象转换成Json的时候,属性setName将被过滤掉。由于json1中没有属性setName,所以将json1反序列化成People对象的时候,boolean类型的setName就没有了值,所以打印的时候取了boolean类型的默认值。于是有了以下结果:

?
1
2
3
4
{ "name" : "People" , "age" : 20 }
{ "name" : "People" , "age" : 20 , "setName" : true }
name=People age= 20  setName= false
name=People age= 20  setName= true

6. Gson还支持使用注解,在com.google.gson.annotation包中,有几个注解Expose, SerializedName, Since和Until,他们各有各的作用,下面使用官方例子介绍常用的注解: 

6.1 Expose

  此注解作用在属性上,表明当序列化和反序列化的时候,这个属性将会暴露给Gson对象。这个注解只有当创建Gson对象时使用GsonBuilder方式创建并调用了GsonBuilder.excludeFieldsWithoutExposeAnnotation() 方法的时候才有效,否则无效。下面是一个介绍@Expose注解如何使用的例子:

?
1
2
3
4
5
6
public  class  User {
      @Expose  private  String firstName;
      @Expose (serialize =  false private  String lastName;
      @Expose  (serialize =  false , deserialize =  false private  String emailAddress;
      private  String password;
}

      如果你以new Gson()的方式创建Gson对象,toJson()方法和fromJson() 方法在序列化和反序列化的时候将会操作这4个属性。然而,如果你使用 Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()来创建Gson对象,Gson 的 toJson() 和 fromJson() 方法将会排除掉 password 字段,这是因为 password 字段没有被注解 @Expose 所标记。 这个 Gson 对象同样会排除 lastName 和 emailAddress 字段,因为注解@Expose的属性 serialize 被设置成了 false。类似的,Gson 将会在反序列化时排除掉 emailAddress 字段,因为 deserialize被设置成了 false。

6.2 SerializedName

  此注解作用在属性上,表明这个属性在序列化成Json的时候,需要将名字序列化成注解的value属性指定的值。

  这个注解将会覆盖任何的FieldNamingPolicy, 包括默认的命名策略。下面是一个介绍@SerializedName注解如何使用的例子: 

?
1
2
3
4
5
6
7
8
public  class  SomeClassWithFields {
      @SerializedName ( "name" private  final  String someField;
      private  final  String someOtherField;
      public  SomeClassWithFields(String a, String b) {
        this .someField = a;
        this .someOtherField = b;
     }
}

      下面的代码展示了序列化上面这个测试类的结果:

?
1
2
3
4
SomeClassWithFields objectToSerialize =  new  SomeClassWithFields( "a" "b" );
Gson gson =  new  Gson();
String jsonRepresentation = gson.toJson(objectToSerialize);
System.out.println(jsonRepresentation);

      执行结果是:

?
1
2
===== OUTPUT =====
{ "name" : "a" , "someOtherField" : "b" }

      由此可见,属性"someField"已经被序列化成了"name"。

  注意:在@SerializedName的value中指定的属性名必须为有效的Json属性名。

6.3 Since和Until相当,请同学们自行查看官网的API文档。

目录
相关文章
|
JSON Java 数据格式
Json和对象之间转换的封装(Gson)
前段时间由于做spring boot的后端,经常需要进行Json 和对象之间的转换,所以利用Gson结合Kotlin扩展函数的特性封装了两个非常方便的函数,如果是其他语言,也可以封装一下,就是没Kotlin方便了。下面展示一下最终封装效果
215 0
Json和对象之间转换的封装(Gson)
|
5天前
|
JSON 数据格式
使用 Gson 将 Map、List等转换为json string
使用 Gson 将 Map、List等转换为json string
12 0
|
4月前
|
JSON Java Android开发
Android网络和数据交互: 请解释Android中的JSON解析库,如Gson。
Android网络和数据交互: 请解释Android中的JSON解析库,如Gson。
25 0
|
5月前
|
JSON 数据格式
gson自定义Type解析json数组字符串
gson自定义Type解析json数组字符串
|
5月前
|
JSON 定位技术 API
谷歌地图接口Google Maps APIs中地图样式设计配置调整与JSON或URL导出
谷歌地图接口Google Maps APIs中地图样式设计配置调整与JSON或URL导出
|
5月前
|
XML JSON Android开发
[Android]使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换
[Android]使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换
56 0
|
7月前
|
JSON 数据格式
Gson转换json数据为HashMap时long类型变为double问题解决
今天再使用Gson处理json数据的时候碰到了一个问题 , 当我使用如下代码解析json数据的时候 , requestTime就变为了double类型
129 0
|
9月前
|
JSON Java Maven
GSON的用法(处理对象和JSON的相互转化)
GSON的用法(处理对象和JSON的相互转化)
149 0
|
12月前
|
JSON 数据格式
Json解析问题—数组用Gson反序列化为List双引号消失
现在的目的是这样的,我想从一串Object类型的字符串,转化成对应的实体类对象。 简单来说就是把这个字符串给一个个独立分开。 我先写出实体类对象和Json的数据,看完再开始解析。
106 0
|
JSON Java API
JSON & GSON - 读取 JSON 文件
JSON & GSON - 读取 JSON 文件
1018 0