zoukankan      html  css  js  c++  java
  • [转]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

  • 相关阅读:
    413 Request Entity Too Large
    小米3手机上加载相册图片失败的问题
    MVC+Ninject+三层架构+代码生成 -- 总结(99)
    1)python 爬取小说
    102)微信小程序 van-dialog
    101) 微信小程序 input 双向绑定
    MVC 表格按树状形式显示 jstree jqgrid
    1. mvc 树形控件tree + 表格jqgrid 显示界面
    叫號系統
    HTML5 下拉控件绑定数据
  • 原文地址:https://www.cnblogs.com/meizixiong/p/4531731.html
Copyright © 2011-2022 走看看