Java的JSON轉(zhuǎn)換類(lèi)庫(kù)GSON的基礎(chǔ)使用教程
Gson (GitHub:https://github.com/google/gson)是 Google 提供的用來(lái)在 Java 對(duì)象和 JSON 數(shù)據(jù)之間進(jìn)行映射的 Java 類(lèi)庫(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ì)象
編寫(xiě)實(shí)體類(lèi):
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; } }
編寫(xiě)測(cè)試類(lèi)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類(lèi)型的屬性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)類(lèi)的對(duì)象塞給Gson,在轉(zhuǎn)換成json的時(shí)候,Gson就會(huì)過(guò)濾掉指定的類(lèi)或者屬性。于是有了下面的代碼:
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ò)濾掉某種類(lèi)型,則重寫(xiě)ExclusionStrategy接口的shouldSkipClass(Class<?> clazz)方法即可,如果需要過(guò)濾掉多種情況,則可以多創(chuàng)建幾個(gè)ExclusionStrategy的實(shí)現(xiàn)類(lèi)對(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類(lèi)型的setName就沒(méi)有了值,所以打印的時(shí)候取了boolean類(lèi)型的默認(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。類(lèi)似的,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è)試類(lèi)的結(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屬性名。
- GSON實(shí)現(xiàn)Java對(duì)象的JSON序列化與反序列化的實(shí)例教程
- Java中Gson的使用詳解
- Java實(shí)現(xiàn)操作JSON的便捷工具類(lèi)完整實(shí)例【重寫(xiě)Google的Gson】
- java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時(shí)間序列化
- 完美解決gson將Integer默認(rèn)轉(zhuǎn)換成Double的問(wèn)題
- gson ajax 數(shù)字精度丟失問(wèn)題的解決方法
- GSON實(shí)現(xiàn)Java對(duì)象與JSON格式對(duì)象相互轉(zhuǎn)換的完全教程
- 舉例講解Java的JSON類(lèi)庫(kù)GSON的基本用法
- Java的JSON格式轉(zhuǎn)換庫(kù)GSON的初步使用筆記
- gson對(duì)象序列化的示例
相關(guān)文章
Java IO流體系繼承結(jié)構(gòu)圖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java IO流體系繼承結(jié)構(gòu)圖,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05Java使用Lettuce客戶(hù)端在Redis在主從復(fù)制模式下命令執(zhí)行的操作
這篇文章主要介紹了Java使用Lettuce客戶(hù)端在Redis在主從復(fù)制模式下命令執(zhí)行的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-04-04springmvc整合freemarker配置的詳細(xì)步驟
本篇文章主要介紹了springmvc整合freemarker的詳細(xì)步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05解讀Spring事務(wù)是如何實(shí)現(xiàn)的
這篇文章主要介紹了Spring事務(wù)是如何實(shí)現(xiàn)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03使用JavaWeb webSocket實(shí)現(xiàn)簡(jiǎn)易的點(diǎn)對(duì)點(diǎn)聊天功能實(shí)例代碼
這篇文章主要介紹了使用JavaWeb webSocket實(shí)現(xiàn)簡(jiǎn)易的點(diǎn)對(duì)點(diǎn)聊天功能實(shí)例代碼的相關(guān)資料,內(nèi)容介紹的非常詳細(xì),具有參考借鑒價(jià)值,感興趣的朋友一起學(xué)習(xí)吧2016-05-05idea mybatis配置log4j打印sql語(yǔ)句的示例
本篇文章主要介紹了idea mybatis配置log4j打印sql語(yǔ)句的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01SpringBoot如何通過(guò)配置文件(yml,properties)限制文件上傳大小
這篇文章主要介紹了SpringBoot如何通過(guò)配置文件(yml,properties)限制文件上傳大小,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03詳解 maven的pom.xml用<exclusion>解決版本問(wèn)題
這篇文章主要介紹了詳解 maven的pom.xml用<exclusion>解決版本問(wèn)題的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09