日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Google GSON:额外的赠品:第二部分

發布時間:2023/12/3 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Google GSON:额外的赠品:第二部分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果您錯過了系列的第一篇文章 ,我們將繼續上一篇文章的“使用GSON ” ,這里是link 。 因此,這里我們進行另一系列的討論。

版本支持

如果要維護一個對象的多個版本以進行JSON轉換,則Google GSON庫具有不錯的@Since注釋。 該注釋可以應用于字段和類。

例如,假設您正在維護REST API的多個版本,并且使用JSON作為最終響應負載。 在API的下一個迭代中,將為特定的JSON實體添加一些字段,并且您不想將新添加的字段發送到以前的API版本,那么@Since注釋就會出現。 讓我們在下面的清單中看到我們如何使用此功能。

要使用此注釋,您必須使用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轉義

默認情況下,在轉換過程中,所有包含的html字符都將轉換為它們對應的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種處理方式,

  • 具有瞬態和靜態修飾符的字段
  • 排除具有特定修飾符的字段
  • 使用公開注釋
  • 用戶定義的排除策略
  • 讓我們詳細了解每個:

  • 具有瞬態和靜態修飾符的字段

    這是默認行為,在其中使用瞬態修飾符修改字段時將不包含該字段,正如我們在系列文章的第一篇文章中所看到的那樣,當然,具有靜態修飾符的字段也將被排除,因為它們是類的一部分,而不是實例的一部分。

  • 排除具有特定修飾符的字段

    您可以配置gson實例,以便它將排除具有指定修飾符的字段,例如,您可以排除/忽略具有保護修飾符或私有修飾符的字段。

    要利用此功能,您需要使用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);

    在以下輸出中,您可以看到按照我們的程序排除了私有字段,盡管您可以忽略可以進行保護,同步等操作的字段。

    Default behaviour {"name": "ajduke","classz": "Developer","languagesKnown": ["Java","Scala","Ruby"] }Ignoring/excluding fields {"languagesKnown": ["Java","Scala","Ruby"] }
  • 使用公開注釋

    Gson還提供了一個注釋,您可以為這些字段進行標記,因此這些字段將從序列化輸出中排除。

    為了使用這個,我們需要遵循以下兩個

  • 如下配置gson實例
    Gson gson = GsonBuilder()。excludeFieldsWithoutExposeAnnotation()。create()
  • 并使用@Expose批注標記字段,這些批注將包含在最終的json輸出中。 因此,未標記的將被排除
  • 以下清單顯示了詳細用法

    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庫根據字段類型和字段屬性提供非常細致的字段排除。

    為此,您需要通過實現接口的兩個方法(如shouldSkipClass()和ShouldSkipField())來實現ExclusionStrategy接口。 前者可以實現為將基于其類型跳過字段,而后可以基于字段屬性(例如其修飾符,其注釋等)實現

    現在,在實現ExclusionStrategy接口之后,您需要將其傳遞給GsonBuilder#setExclusionStrategies()方法以配置gson實例。

    以下是使用排除策略的最低限度實現,其中我們排除類型為String,List的字段以及具有注釋為Deprecated的字段

    請注意ExclusionStrategy的以下實現

    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默認包含與類字段名稱相同的輸出json字段名稱,我們也可以使用批注@serilizedName覆蓋它。

    在Gson中,我們還可以定義json字段名稱以更改為大寫,小寫等,而無需使用任何注釋。

    為此,您需要使用GsonBuilder()。setFieldNamingPolicy()方法并傳遞適當的FieldNamePolicy

    以下清單顯示了用法:

    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

    總結

    以上是生活随笔為你收集整理的使用Google GSON:额外的赠品:第二部分的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。