博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Google-Gson使用
阅读量:7091 次
发布时间:2019-06-28

本文共 4875 字,大约阅读时间需要 16 分钟。

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

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

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

   

  
com.google.code.gson
  
gson
  
2.2.4

   2. 编写实体类:

 

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

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. 输出结果:

  

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

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

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

 

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类型的默认值。于是有了 以下结果:

{"name":"People","age":20}{
"name":"People","age":20,"setName":true}name=People age=20 setName=falsename=People age=20 setName=true

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

6.1 Expose

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

 

 

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属性指定的值。

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

 

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;    }}

 

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

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

执行结果是:

===== OUTPUT ====={
"name":"a","someOtherField":"b"}

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

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

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

 

转载地址:http://canql.baihongyu.com/

你可能感兴趣的文章
浅谈oracle中row_number() over()分析函数用法
查看>>
jqGrid细节备注—jqGrid中获取subGrid的标题栏对象
查看>>
我给淘宝孙彤宇下的两个套和敬佩他的四个理由
查看>>
freemarker快速上手+空值的多种处理方法
查看>>
详解AJAX核心中的XMLHttpRequest对象
查看>>
由一幅漫画想到的
查看>>
利用SQL SERVER 2005数据库镜像实现可用性
查看>>
化堵为通 打破运维瓶颈
查看>>
SQL Server 2008备份策略设计下(六)
查看>>
微软桌面虚拟化所需产品及RemoteFX要求介绍
查看>>
OpenOffice介绍
查看>>
WindowsServer2008下的Oracle群集配置
查看>>
IT人必读:写给浮躁的IT同仁(请不要做浮躁的人)
查看>>
剑破冰山—Oracle开发艺术 目录
查看>>
Elastalert-基于Elasticsearch层面的监控告警框架
查看>>
蓝屏代码为0x00000051的解决方案
查看>>
Java线程:深入ThreadLocal
查看>>
Linux下安装PCRE
查看>>
一次网站性能排查实录
查看>>
Cocos2d-x跨平台开发利器--EasyNDK-for-cocos2dx
查看>>