使用Google GSON:额外的赠品:第二部分
如果您錯過了系列的第一篇文章 ,我們將繼續(xù)上一篇文章的“使用GSON ” ,這里是link 。 因此,這里我們進(jìn)行另一系列的討論。
版本支持
如果要維護(hù)一個對象的多個版本以進(jìn)行JSON轉(zhuǎn)換,則Google GSON庫具有不錯的@Since注釋。 該注釋可以應(yīng)用于字段和類。
例如,假設(shè)您正在維護(hù)REST API的多個版本,并且使用JSON作為最終響應(yīng)負(fù)載。 在API的下一個迭代中,將為特定的JSON實體添加一些字段,并且您不想將新添加的字段發(fā)送到以前的API版本,那么@Since注釋就會出現(xiàn)。 讓我們在下面的清單中看到我們?nèi)绾问褂么斯δ堋?
要使用此注釋,您必須使用GsonBuilder將Gson實例配置為特定版本。
public class Example33 {public static void main(String[] args) {Gson gson = new GsonBuilder().setVersion(2.0).create();String json = gson.toJson(new ExampleClass());System.out.println("Output for version 2.0...");System.out.println(json);gson= new GsonBuilder().setVersion(1.0).create();json = gson.toJson(new ExampleClass());System.out.println("\nOutput for version 1.0...");System.out.println(json);gson= new Gson();json = gson.toJson(new ExampleClass());System.out.println("\nOutput for No version set...");System.out.println(json);} }class ExampleClass{String field= "field";// this is in version 1.0@Since(1.0) String newField1 = "field 1";// following will be included in the version 1.1@Since(2.0) String newField2 = "field 2"; }上面的輸出為:
Output for version 2.0... {"field":"field","newField1":"field 1","newField2":"field 2"}Output for version 1.0... {"field":"field","newField1":"field 1"}Output for No version set... {"field":"field","newField1":"field 1","newField2":"field 2"}如果您未指定任何版本,則無論其版本如何,它將包括所有字段。
禁用HTML轉(zhuǎn)義
默認(rèn)情況下,在轉(zhuǎn)換過程中,所有包含的html字符都將轉(zhuǎn)換為它們對應(yīng)的Unicode,即<到\ u003c, >到\ u003e, &到\ u0026,依此類推。
要按原樣傳遞html字符,您需要將gson實例配置為使用GsonBuilder#disableHtmlEscaping()方法。
以下清單顯示了用法:
public class Example34 {public static void main(String[] args) {String str ="<myval>";Gson gson = new Gson();System.out.println("Normal behaviour...");System.out.println(gson.toJson(str));System.out.println("\nDisabled html escaping...");gson = new GsonBuilder().disableHtmlEscaping().create();System.out.println(gson.toJson(str));} }輸出如下:
Normal behaviour... "\u003cmyval\u003e"Disabled html escaping... "<myval>"從Json Output中排除字段
為此,Google GSON有4種處理方式,
讓我們詳細(xì)了解每個:
這是默認(rèn)行為,在其中使用瞬態(tài)修飾符修改字段時將不包含該字段,正如我們在系列文章的第一篇文章中所看到的那樣,當(dāng)然,具有靜態(tài)修飾符的字段也將被排除,因為它們是類的一部分,而不是實例的一部分。
您可以配置gson實例,以便它將排除具有指定修飾符的字段,例如,您可以排除/忽略具有保護(hù)修飾符或私有修飾符的字段。
要利用此功能,您需要使用GsonBuilder#excludeFieldsWithModifiers() ,如以下一系列清單所示。
class Developer {private String name;private String classz;List<String> languagesKnown;public Developer() {name = "ajduke";classz= "Developer";languagesKnown = new ArrayList<>();languagesKnown.add("Java");languagesKnown.add("Scala");languagesKnown.add("Ruby");} }對于此示例,我們不包括私有字段。 盡管您可以使用任何修飾符(適用于字段的任何修飾符)排除字段
Gson gson = new Gson();System.out.println("Default behaviour "); GsonBuilder gsonBuilder = new GsonBuilder(); Gson prettyGson = gsonBuilder.setPrettyPrinting().create(); String json = prettyGson.toJson(new Developer()); System.out.println(json);System.out.println("Ignoring/excluding fields ");GsonBuilder excludeFieldsWithModifiers = gsonBuilder.excludeFieldsWithModifiers(Modifier.PRIVATE);Gson create = excludeFieldsWithModifiers.create(); String json2 = create.toJson(new Developer()); System.out.println(json2);在以下輸出中,您可以看到按照我們的程序排除了私有字段,盡管您可以忽略可以進(jìn)行保護(hù),同步等操作的字段。
Default behaviour {"name": "ajduke","classz": "Developer","languagesKnown": ["Java","Scala","Ruby"] }Ignoring/excluding fields {"languagesKnown": ["Java","Scala","Ruby"] }Gson還提供了一個注釋,您可以為這些字段進(jìn)行標(biāo)記,因此這些字段將從序列化輸出中排除。
為了使用這個,我們需要遵循以下兩個
Gson gson = GsonBuilder()。excludeFieldsWithoutExposeAnnotation()。create()
以下清單顯示了詳細(xì)用法
class Developer {// this field will be included@Exposeprivate String name;private String classz;List<String> languagesKnown;public Developer() {name = "ajduke";languagesKnown = new ArrayList<>();languagesKnown.add("Java");languagesKnown.add("Scala");languagesKnown.add("Ruby");} }public class GsonEx {public static void main(String[] args) throws IOException {Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();String json = gson.toJson(new Developer());System.out.println(json);} }輸出如下:
{"name":"ajduke"}Google Gson庫根據(jù)字段類型和字段屬性提供非常細(xì)致的字段排除。
為此,您需要通過實現(xiàn)接口的兩個方法(如shouldSkipClass()和ShouldSkipField())來實現(xiàn)ExclusionStrategy接口。 前者可以實現(xiàn)為將基于其類型跳過字段,而后可以基于字段屬性(例如其修飾符,其注釋等)實現(xiàn)
現(xiàn)在,在實現(xiàn)ExclusionStrategy接口之后,您需要將其傳遞給GsonBuilder#setExclusionStrategies()方法以配置gson實例。
以下是使用排除策略的最低限度實現(xiàn),其中我們排除類型為String,List的字段以及具有注釋為Deprecated的字段
請注意ExclusionStrategy的以下實現(xiàn)
class ExclusionStrategyImpl implements ExclusionStrategy {private final Class<?> classTypeToSkip;public ExclusionStrategyImpl(Class<?> classTypeToSkip) {this.classTypeToSkip = classTypeToSkip;}@Overridepublic boolean shouldSkipClass(Class<?> claz) {return classTypeToSkip == claz;}@Overridepublic boolean shouldSkipField(FieldAttributes fa) {return fa.getAnnotation(Deprecated.class) !=null;} }我們的自定義Developer類用于顯示示例:
class Developer {@Deprecatedprivate int count = 45;private String name;private String classz;List<String> languagesKnown;public Developer() {name = "ajduke";classz = Developer.class.getCanonicalName();languagesKnown = new ArrayList<>();languagesKnown.add("Java");languagesKnown.add("Scala");languagesKnown.add("Ruby");} }public class Ex35 {public static void main(String[] args) {Gson gson = null;Developer developer = new Developer();String json = null;gson = new Gson();json = gson.toJson(developer);System.out.println("Default behaviuor....");System.out.println(json);// exclude field having Stringgson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategyImpl(List.class)).create();json = gson.toJson(developer);System.out.println("\nExclude fields with type - List");System.out.println(json);// exclude field having List gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategyImpl(String.class)).create();json = gson.toJson(developer);System.out.println("\nExclude fields with type - String");System.out.println(json);} }上面的輸出如下:
Default behaviuor.... {"count":45,"name":"ajduke","classz":"in.ajduke.ap013.Developer","languagesKnown":["Java","Scala","Ruby"]}Exclude fields with type - List {"name":"ajduke","classz":"in.ajduke.ap013.Developer"}Exclude fields with type - String {"languagesKnown":[null,null,null]}使用字段命名策略的自定義字段命名
正如我們在上一篇文章中看到的,Gson默認(rèn)包含與類字段名稱相同的輸出json字段名稱,我們也可以使用批注@serilizedName覆蓋它。
在Gson中,我們還可以定義json字段名稱以更改為大寫,小寫等,而無需使用任何注釋。
為此,您需要使用GsonBuilder()。setFieldNamingPolicy()方法并傳遞適當(dāng)?shù)腇ieldNamePolicy
以下清單顯示了用法:
package in.ajduke.ap013;import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder;public class Example34 {public static void main(String[] args) {Gson gson = new Gson();String json = gson.toJson(new JsonClass());System.out.println("Default behaviour....");System.out.println(json);gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES).create();json = gson.toJson(new JsonClass());System.out.println("\nFields with lower case with dashes...");System.out.println(json);gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES).create();json = gson.toJson(new JsonClass());System.out.println("\nFields with upper case with spaces...");System.out.println(json);} }class JsonClass {String myField = "value1";String myAnotherField = "value2"; }Default behaviour.... {"myField":"value1","myAnotherField":"value2"}Fields with lower case and dashes... {"my-field":"value1","my-another-field":"value2"}Fields with lower case and dashes... {"My Field":"value1","My Another Field":"value2"} 參考: 使用Google GSON:額外的東西:來自我們的JCG合作伙伴 Abhijeet Sutar的 第二部分,來自ajduke的博客博客。翻譯自: https://www.javacodegeeks.com/2014/01/using-google-gson-extra-goodies-part-ii.html
總結(jié)
以上是生活随笔為你收集整理的使用Google GSON:额外的赠品:第二部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 螃蟹爱吃什么 一般螃蟹喜欢吃什么
- 下一篇: ddos怎么解决(香港ddos解决方案)