[转]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 = 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

时间: 2024-08-07 04:09:08

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

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

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

Google Gson解析Json数据应用实例

转自:http://lixigao449778967.blog.163.com/blog/static/24985164201269105928783/ 1.需要的Jar包 1) Google Gson(gson-xxx.jar)下载地址:http://code.google.com/p/google-gson/downloads/list 2)JUnit4 2. 应用实例代码 下载地址:http://download.csdn.net/source/3499627 包括如下类: 1)普通Jav

Json转换利器Gson—— List to Json

Json一种非常常用的数据交换方式,又因为我们现在Web框架使用的Easyui(其中最常用的table表格绑定的Json数据),Json的应用就必不可少了,我们现在从后台数据库得到的数据常用的类型是实体和list,都属于集合,性质是一样的,从实体或者list转成Json数据传到界面就是最关键的了. 其实Java中Json的解析方式有很多种,我们可以直接使用Java的JSONObject库,除此之外还有fastjson,Gson,jackson等等这些Json处理类库,共同之处不仅方便我们开发,转

从零开始学android开发-Json转换利器Gson之实例

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. jar和源码下载地址: http://code.google.com/p/google-gson/downloads/list 实体类: public class Student { private int id; private String name; private Date birthDay; public int

Json转换利器Gson之实例

描述 Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来 示例 import java.lang.reflect.Type; import java.sql.Timestamp; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import j

Json转换利器Gson之实例二-Gson注解和GsonBuilder

有时候我们不需要把实体的所有属性都导出,只想把一部分属性导出为Json. 有时候我们的实体类会随着版本的升级而修改. 有时候我们想对输出的json默认排好格式. ... ... 请看下面的例子吧: 实体类: [java] view plaincopy import java.util.Date; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public 

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

Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库.可以将一个 JSON 字符串转成一个 Java 对象,或者反过来. jar和源码下载地址: http://code.google.com/p/google-gson/downloads/list 实体类: [java] view plaincopy [java] view plaincopy public class Student { private int id; private Str

Android网络之数据解析----使用Google Gson解析Json数据

[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4063452.html 联系方式:[email protected] [正文] 文章回顾: Android网络之数据解析----SAX方式解析XML数据 一.Json数据的介绍                                                             

java util - json转换工具 gson

需要 gson-2.7.jar 包 package cn.java.gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; public class Test { public static void main(String[] args) { dataType(); dataObj(); dataArray(); } publi