JSON

Java的JSON转换类库GSON的基础使用教程

字号+ 作者:H5之家 来源:H5之家 2016-06-28 14:00 我要评论( )

IT学习网是国内以普及电脑技术的学习资料网站,本站历经长期发展已深得广大电脑爱好者的好评和喜爱,为您提供从基础到高端的信息技术学习平台,我们也努力将IT学习

Gson (GitHub:https://github.com/google/gson)是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
Gson里最重要的对象有2个Gson 和 GsonBuilder。
Gson有2个最基本的方法
(1)toJson() – 转换java 对象到JSON
(2)fromJson() – 转换JSON到java对象

编写实体类:

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

编写测试类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));   } }

输出结果:

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

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

在Gson的包中找半天,发现com.google.gson包下面有这么一个接口:ExclusionStrategy ,虽然不清楚是干什么的,但是根据名字,可以推断,这个接口是用来设置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=false name=People age=20 setName=true

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

Expose:

此注解作用在属性上,表明当序列化和反序列化的时候,这个属性将会暴露给Gson对象。这个注解只有当创建Gson对象时使用GsonBuilder方式创建并调用了GsonBuilder.excludeFieldsWithoutExposeAnnotation() 方法的时候才有效,否则无效。下面是一个介绍@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。

SerializedName:

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • GSON实现Java对象的JSON序列化与反序列化的实例教程

    GSON实现Java对象的JSON序列化与反序列化的实例教程

    2016-06-28 13:00

  • jquery遍历json对象集合详解

    jquery遍历json对象集合详解

    2016-06-07 13:00

  • 新型Infostealer木马使用Fiddler代理和Json.NET

    新型Infostealer木马使用Fiddler代理和Json.NET

    2016-05-12 11:03

  • C# JSON格式化转换辅助类 ConvertJson

    C# JSON格式化转换辅助类 ConvertJson

    2016-05-02 18:00

网友点评