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

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

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

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

2. 编写实体类:

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

3. 编写测试类GsonTest

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

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

原来,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. {"name":"People","age":20}
  2. {"name":"People","age":20,"setName":true}
  3. name=People age=20 setName=false
  4. 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. public class User {
  2.  @Expose private String firstName;
  3.  @Expose(serialize = false) private String lastName;
  4.  @Expose (serialize = false, deserialize = false) private String emailAddress;
  5.  private String password;
  6. }

如果你以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. public class SomeClassWithFields {
  2.  @SerializedName("name") private final String someField;
  3.  private final String someOtherField;
  4.  public SomeClassWithFields(String a, String b) {
  5.  this.someField = a;
  6.  this.someOtherField = b;
  7.  }
  8. }

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

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

执行结果是:

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

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

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

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

Google-Gson使用的更多相关文章

  1. [转]Json转换神器之Google Gson的使用

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

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

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

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

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

  4. Exception in thread “main” com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: empty String

    String json="A valid json"; Job job = new Gson().fromJson(json, Job.class); Exception in t ...

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

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

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

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

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

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

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

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

  9. [Android] 对于com.google.gson.JsonElement的转义问题

    不多说了,com.google.gson.JsonElement使用的时候,toString()跟getAsString()这两个方法对于特殊字符的转义是不同的, 看这里的解释: https://st ...

  10. Multiple dex files define Lcom/google/gson/internal/Streams$AppendableWriter$CurrentWrite;

    开发中引入第三方 aar 时编译同过,运行时出现问题: Multiple dex files define Lcom/google/gson/internal/Streams$AppendableWr ...

随机推荐

  1. OC8_NSData

    // // main.m // OC8_NSData // // Created by zhangxueming on 15/6/19. // Copyright (c) 2015年 zhangxue ...

  2. Session 的配置和特性

    session的配置 对于session的配置是php.ini中配置 session数据都是保存在文本文件中 设置session文件的保存位置 说明:     默认是保存在windows/temp目录 ...

  3. Apache使用mysql认证用户

    使用MySQL进行认证 第1步:下载MySQL认证模块,并更名为mod_auth_mysql.so文件,并保存在apache的modules目录下 第2步:apache要加载此功能模块 LoadMod ...

  4. 通过命令行连接oracle数据库/进入sql plus

    1.直接打开SQL Plus登录,需要用户名和密码 开始->程序->Oracle->应用程序开发->sqlplus 我的电脑是“开始”->“Oracle - OraDb1 ...

  5. OCI的结果输出

    绑定变量,把结果以列的方式输出到每一字段输出到一个数组里

  6. 输入与enter

    #include<iostream> using namespace std; int main() { char a,b,c; while(scanf("%c%c%c" ...

  7. 关于fputs和fgets的几个细节

    C语言中两个标准IO fputs和fgets都是针对行来进行数据的读取的!这里关于这两个IO函数我有几个小细节想在这里和大家分享一下,希望能够对大家产生帮助! 首先贴上这两个函数的函数声明,下面以这两 ...

  8. 在Windows 7下面IIS7的安装和 配置ASP的正确方法

    在Windows 7下如何安装IIS7,以及IIS7在安装过程中的一些需要注意的设置,以及在IIS7下配置ASP的正确方法. 一.进入Windows 7的 控制面板,选择左侧的打开或关闭Windows ...

  9. phpstorm 自定义函数配置

    phpstorm 自定义函数配置 打开设置->活动模板->

  10. Oracle RAC LoadBalance

    LoadBalance 就是把负载平均的分配到集群中的各个节点,从而提高整体的吞吐能力. Oracle 10g RAC 提供了两种不同的方法来分散负载: 通过Connection Balancing, ...