这几天,因为项目的需要,接触了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 = falseprivate String lastName;
    @Expose (serialize = false, deserialize = falseprivate 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文档。

转自:http://my.oschina.net/itblog/blog/204120

[转]Json转换神器之Google Gson的使用的更多相关文章

  1. org.json.JSONObject与com.google.gson.Gson

    org.json库为JSON创始人编写的解析JSON的java库,Gson为Google为我们提供的解析JSON格式数据的库. Gson里最重要的对象有2个Gson 和GsonBuilder. Gso ...

  2. map转换成com.google.gson.JsonObject

    String json =new Gson().toJson(map); JsonObject jsonObject =new JsonParser().parse(json).getAsJsonOb ...

  3. Json转换工具类(基于google的Gson和阿里的fastjson)

    在项目之中我们经常会涉及到字符串和各种对象的转换,为此特地整理了一下常用的转换方法 一.基于com.google.code.gson封装的json转换工具类 1. 在pom.xml文件里面引入gson ...

  4. Java对【JSON数据的解析】--Gson解析法

    Gson和fastjson分别为谷歌和阿里巴巴对JSON数据进行处理封装的jar包 两者异同点: 相同点:都是根据JSON数据创建相应的类 不同点: 1.调用方式区别 谷歌:方法都是非静态的,需要先创 ...

  5. [转]使用 google gson 转换Timestamp或Date类型为JSON字符串.

    创建类型适配类: import java.lang.reflect.Type; import java.sql.Timestamp; import java.text.DateFormat; impo ...

  6. 使用 google gson 转换Timestamp或Date类型为JSON字符串.

    http://blog.csdn.net/z69183787/article/details/13016289 创建类型适配类: import java.lang.reflect.Type; impo ...

  7. 使用 google gson 转换Timestamp为JSON字符串

    package com.test.base; import java.lang.reflect.Type; import java.sql.Timestamp; import java.text.Da ...

  8. Json转换利器Gson之实例一-简单对象转化和带泛型的List转化 (转)

    Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. jar和源码下载地址: h ...

  9. Google Gson解析Json数据应用实例

    转自:http://lixigao449778967.blog.163.com/blog/static/24985164201269105928783/ 1.需要的Jar包 1) Google Gso ...

随机推荐

  1. winform控件

    公共控件:1.Button: Enabled - 开始不可用 Visible -不可视(用来设置权限,取用户看不见的值)2.CheckBox .CheckListBox -复选框,复选框组 3.Com ...

  2. border-style 属性

    border-style 属性用于设置元素所有边框的样式,或者单独地为各边设置边框样式. 只有当这个值不是 none 时边框才可能出现. 例子 1 border-style:dotted solid ...

  3. 让禅道也可以玩BearyChat

    简单的理解,BearycChat是一种IM,是一种能聚合各种MS系统消息的东西,是团队协作过程中消息流转的利器. 我是工具控,所以不折腾不舒服. 废话不说,上码: /path_to_zentao/mo ...

  4. 免安装的tomcat双击startup.bat后,启动窗口一闪而过,而且tomcat服务未启动。

    免安装的tomcat双击startup.bat后,启动窗口一闪而过,而且tomcat服务未启动. 原因是:在启动tomcat是,需要读取环境变量和配置信息,缺少了这些信息,就不能登记环境变量,导致了t ...

  5. Android中的checkbox和RadioButton的区别

    1.单个RadioButton在选中后,通过点击无法变为未选中       单个CheckBox在选中后,通过点击可以变为未选中 2.一组RadioButton,只能同时选中一个      一组Che ...

  6. GJM : Unity3D 常用网络框架与实战解析 【笔记】

    Unity常用网络框架与实战解析 1.Http协议          Http协议                  存在TCP 之上 有时候 TLS\SSL 之上 默认端口80 https 默认端口 ...

  7. [ASP.NET MVC] 使用CLK.AspNet.Identity提供依权限显示选单项目的功能

    [ASP.NET MVC] 使用CLK.AspNet.Identity提供依权限显示选单项目的功能 CLK.AspNet.Identity CLK.AspNet.Identity是一个基于ASP.NE ...

  8. 钉钉客户端JS-API权限签名算法.NET版

    前段时间写了一篇博文<钉钉如何进行PC端开发>,在里面并未解决本地生成签名的问题,需要到官网进行生成,由于钉钉门票等认证信息会超期,因此,必须能本地用代码自动更新相关参数信息,来换取签名. ...

  9. 20个免费的 AngularJS 资源和开发教程

    曾经,jQuery 无疑是最受欢迎的开源的 JavaScript 库,如今它有了很多的竞争对手,像 AngularJS.React.KnockoutJS 等等.在这里,我想重点关注一下 Angular ...

  10. Nunchuck.js - 轻松实现多个设备的数据同步

    Nunchuck.js 是对用于移动设备上的浏览器应用程序的控制库,通过浏览器轻松实现多设备数据同步.他们提供了一个库,很容易使开发人员能够整合移动浏览器控件到桌面的基于浏览器的 JavaScript ...