程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java的JSON轉換類庫GSON的基本應用教程

Java的JSON轉換類庫GSON的基本應用教程

編輯:關於JAVA

Java的JSON轉換類庫GSON的基本應用教程。本站提示廣大學習愛好者:(Java的JSON轉換類庫GSON的基本應用教程)文章只能為提供參考,不一定能成為您想要的結果。以下是Java的JSON轉換類庫GSON的基本應用教程正文


Gson (GitHub:https://github.com/谷歌/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.谷歌.gson.ExclusionStrategy;
import com.谷歌.gson.FieldAttributes;
import com.谷歌.gson.Gson;
import com.谷歌.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.谷歌.gson包上面有這麼一個接口:ExclusionStrategy ,固然不清晰是干甚麼的,然則依據名字,可以揣摸,這個接口是用來設置Gson轉換的消除戰略的,因而在官網http://谷歌-gson.谷歌code.com/svn/trunk/gson/docs/javadocs/index.html查了一下這個接口,發明只需完成這個接口,並將完成類的對象塞給Gson,在轉換成json的時刻,Gson就會過濾失落指定的類或許屬性。因而有了上面的代碼:

import com.谷歌.gson.ExclusionStrategy;
import com.谷歌.gson.FieldAttributes;
import com.谷歌.gson.Gson;
import com.谷歌.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.谷歌.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:

此注解感化在屬性上,注解這個屬性在序列化成Json的時刻,須要將名字序列化成注解的value屬性指定的值。

這個注解將會籠罩任何的FieldNamingPolicy, 包含默許的定名戰略。上面是一個引見@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);

履行成果是:

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

因而可知,屬性"someField"曾經被序列化成了"name"。

留意:在@SerializedName的value中指定的屬性名必需為有用的Json屬性名。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved