最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java的JSON轉(zhuǎn)換類庫(kù)GSON的基礎(chǔ)使用教程

 更新時(shí)間:2016年06月22日 11:36:54   作者:擺渡者  
GSON是谷歌開(kāi)源的一款Java對(duì)象與JSON對(duì)象互相轉(zhuǎn)換的類庫(kù),Java的JSON轉(zhuǎn)換類庫(kù)GSON的基礎(chǔ)使用教程,需要的朋友可以參考下

Gson (GitHub:https://github.com/google/gson)是 Google 提供的用來(lái)在 Java 對(duì)象和 JSON 數(shù)據(jù)之間進(jìn)行映射的 Java 類庫(kù)??梢詫⒁粋€(gè) JSON 字符串轉(zhuǎn)成一個(gè) Java 對(duì)象,或者反過(guò)來(lái)。
Gson里最重要的對(duì)象有2個(gè)Gson 和 GsonBuilder。
Gson有2個(gè)最基本的方法
(1)toJson() – 轉(zhuǎn)換java 對(duì)象到JSON
(2)fromJson() – 轉(zhuǎn)換JSON到j(luò)ava對(duì)象

編寫實(shí)體類:

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

編寫測(cè)試類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));
  }
}

輸出結(jié)果:

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

這只是最簡(jiǎn)單的Gson的使用。如果我們需要將bool類型的屬性setName在轉(zhuǎn)換成json的時(shí)候不轉(zhuǎn)換,怎么實(shí)現(xiàn)呢?

在Gson的包中找半天,發(fā)現(xiàn)com.google.gson包下面有這么一個(gè)接口:ExclusionStrategy ,雖然不清楚是干什么的,但是根據(jù)名字,可以推斷,這個(gè)接口是用來(lái)設(shè)置Gson轉(zhuǎn)換的排除策略的,于是在官網(wǎng)http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html查了一下這個(gè)接口,發(fā)現(xiàn)只要實(shí)現(xiàn)這個(gè)接口,并將實(shí)現(xiàn)類的對(duì)象塞給Gson,在轉(zhuǎn)換成json的時(shí)候,Gson就會(huì)過(guò)濾掉指定的類或者屬性。于是有了下面的代碼:

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

原來(lái),Gson對(duì)象的創(chuàng)建有兩種方式:new Gson()表示使用默認(rèn)的配置創(chuàng)建一個(gè)Gson對(duì)象,而如果使用GsonBuilder.create()方法創(chuàng)建,則可以自定義一些設(shè)置,這主要是為了使創(chuàng)建的Gson更適合于某些特定的情況。上例中第一段藍(lán)色的代碼創(chuàng)建了一個(gè)Gson對(duì)象,這個(gè)對(duì)象擁有對(duì)以“set”字樣開(kāi)頭的屬性的過(guò)濾的配置(如果需要過(guò)濾掉某種類型,則重寫ExclusionStrategy接口的shouldSkipClass(Class<?> clazz)方法即可,如果需要過(guò)濾掉多種情況,則可以多創(chuàng)建幾個(gè)ExclusionStrategy的實(shí)現(xiàn)類對(duì)象,并在創(chuàng)建Gson對(duì)象的時(shí)候設(shè)置進(jìn)去即可),因此在本例中,將People對(duì)象轉(zhuǎn)換成Json的時(shí)候,屬性setName將被過(guò)濾掉。由于json1中沒(méi)有屬性setName,所以將json1反序列化成People對(duì)象的時(shí)候,boolean類型的setName就沒(méi)有了值,所以打印的時(shí)候取了boolean類型的默認(rèn)值。于是有了以下結(jié)果:

{"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包中,有幾個(gè)注解Expose, SerializedName, Since和Until,他們各有各的作用,下面使用官方例子介紹常用的注解: 

Expose:

此注解作用在屬性上,表明當(dāng)序列化和反序列化的時(shí)候,這個(gè)屬性將會(huì)暴露給Gson對(duì)象。這個(gè)注解只有當(dāng)創(chuàng)建Gson對(duì)象時(shí)使用GsonBuilder方式創(chuàng)建并調(diào)用了GsonBuilder.excludeFieldsWithoutExposeAnnotation() 方法的時(shí)候才有效,否則無(wú)效。下面是一個(gè)介紹@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()的方式創(chuàng)建Gson對(duì)象,toJson()方法和fromJson() 方法在序列化和反序列化的時(shí)候?qū)?huì)操作這4個(gè)屬性。然而,如果你使用 Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create()來(lái)創(chuàng)建Gson對(duì)象,Gson 的 toJson() 和 fromJson() 方法將會(huì)排除掉 password 字段,這是因?yàn)?password 字段沒(méi)有被注解 @Expose 所標(biāo)記。 這個(gè) Gson 對(duì)象同樣會(huì)排除 lastName 和 emailAddress 字段,因?yàn)樽⒔釦Expose的屬性 serialize 被設(shè)置成了 false。類似的,Gson 將會(huì)在反序列化時(shí)排除掉 emailAddress 字段,因?yàn)?deserialize被設(shè)置成了 false。

SerializedName:

此注解作用在屬性上,表明這個(gè)屬性在序列化成Json的時(shí)候,需要將名字序列化成注解的value屬性指定的值。

這個(gè)注解將會(huì)覆蓋任何的FieldNamingPolicy, 包括默認(rèn)的命名策略。下面是一個(gè)介紹@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;
  }
}

下面的代碼展示了序列化上面這個(gè)測(cè)試類的結(jié)果:

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

執(zhí)行結(jié)果是:

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

由此可見(jiàn),屬性"someField"已經(jīng)被序列化成了"name"。

注意:在@SerializedName的value中指定的屬性名必須為有效的Json屬性名。

相關(guān)文章

  • IDEA 2020.1.2 安裝教程附破解教程詳解

    IDEA 2020.1.2 安裝教程附破解教程詳解

    這篇文章主要介紹了IDEA 2020.1.2 安裝教程附帶破解教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • java設(shè)計(jì)模式筆記之裝飾模式

    java設(shè)計(jì)模式筆記之裝飾模式

    這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式筆記之裝飾模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • 詳解Java中自定義注解的使用

    詳解Java中自定義注解的使用

    Annontation是Java5開(kāi)始引入的新特征,中文名稱叫注解,它提供了一種安全的類似注釋的機(jī)制,用來(lái)將任何的信息或元數(shù)據(jù)(metadata)與程序元素(類、方法、成員變量等)進(jìn)行關(guān)聯(lián)。本文主要介紹了自定義注解的使用,希望對(duì)大家有所幫助
    2023-03-03
  • SpringCloud_Eureka服務(wù)注冊(cè)與發(fā)現(xiàn)基礎(chǔ)及構(gòu)建步驟

    SpringCloud_Eureka服務(wù)注冊(cè)與發(fā)現(xiàn)基礎(chǔ)及構(gòu)建步驟

    Eureka服務(wù)注冊(cè)中心,主要用于提供服務(wù)注冊(cè)功能,當(dāng)微服務(wù)啟動(dòng)時(shí),會(huì)將自己的服務(wù)注冊(cè)到Eureka Server,這篇文章主要介紹了SpringCloud中Eureka的配置及詳細(xì)使用,需要的朋友可以參考下
    2023-01-01
  • java兩個(gè)integer數(shù)據(jù)判斷相等用==還是equals

    java兩個(gè)integer數(shù)據(jù)判斷相等用==還是equals

    本文主要介紹了java兩個(gè)integer數(shù)據(jù)判斷相等用==還是equals,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • java環(huán)境變量path和classpath的配置

    java環(huán)境變量path和classpath的配置

    這篇文章主要為大家詳細(xì)介紹了java系統(tǒng)環(huán)境變量path和classpath的配置過(guò)程,感興趣的小伙伴們可以參考一下
    2016-07-07
  • Spring?Data?Jpa?復(fù)雜查詢方式總結(jié)(多表關(guān)聯(lián)及自定義分頁(yè))

    Spring?Data?Jpa?復(fù)雜查詢方式總結(jié)(多表關(guān)聯(lián)及自定義分頁(yè))

    這篇文章主要介紹了Spring?Data?Jpa?復(fù)雜查詢方式總結(jié)(多表關(guān)聯(lián)及自定義分頁(yè)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java?SE封裝、包、static關(guān)鍵字和代碼塊示例詳解

    Java?SE封裝、包、static關(guān)鍵字和代碼塊示例詳解

    這篇文章主要給大家介紹了關(guān)于Java?SE封裝、包、static關(guān)鍵字和代碼塊的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • Java?集合框架掌握?Map?和?Set?的使用(內(nèi)含哈希表源碼解讀及面試??碱})

    Java?集合框架掌握?Map?和?Set?的使用(內(nèi)含哈希表源碼解讀及面試??碱})

    這篇文章主要介紹了Java?集合框架掌握?Map?和?Set?的使用并含有內(nèi)含哈希表源碼解讀及面試常考題,?Map?和?Set?是一種適合動(dòng)態(tài)查找的集合容器或者數(shù)據(jù)結(jié)構(gòu)下面文章詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2021-12-12
  • Mapper批量插入Oracle數(shù)據(jù)@InsertProvider注解

    Mapper批量插入Oracle數(shù)據(jù)@InsertProvider注解

    今天小編就為大家分享一篇關(guān)于Mapper批量插入Oracle數(shù)據(jù)@InsertProvider注解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03

最新評(píng)論

清河县| 沙田区| 洪洞县| 田林县| 全南县| 中卫市| 鱼台县| 京山县| 综艺| 道真| 广水市| 梁平县| 集安市| 收藏| 安岳县| 嘉荫县| 称多县| 仁寿县| 启东市| 蓝山县| 渭源县| 卢氏县| 龙胜| 夏邑县| 神池县| 上虞市| 崇信县| 南汇区| 丰顺县| 巴塘县| 长治市| 南通市| 文登市| 紫金县| 崇阳县| 凯里市| 永胜县| 海淀区| 普陀区| 北安市| 五家渠市|