Java 實體類轉json對象,屬性名轉key后首字母強制被轉成小寫的解決方案


1.情景展示

  如上圖所示,實體類轉json,在Java開發中還是很常見的,問題在於:Java屬性名稱首字母是大寫,要求轉成json后首字母也必須是大寫,如何實現?   

2.原因分析

  我們知道在Java規范中,實體類的屬性名的命名規范需要遵循首字母小寫的駝峰命名法,既是規范也是約束也是牢籠。這個時候一旦有人不按規范走,就會發生有趣的事情(一會再說)。

  先來看看Java實體類構成:

  開始嘗試

  使用netJson

  如上圖所示,首字母被強轉小寫,既然不行,就換一個json; 

  使用aliJson

 

  照樣不行。 

  此時,被關在籠子里的人就會炸開了鍋:WAHT FUCK,兩個json都不支持,你為什么不按規范走?此時,就會被沖昏頭腦,去指責對方而不是承認自己的無能。

3.解決方案

  規范是死的,人是活的,所以,我才說規范有時會像牢籠,束縛着我們前進的腳步,不敢越雷池一步。解決辦法還是有的。

  引入谷歌的GSON

<!--序列化:實體類轉json需要用到(原Java類中的屬性轉成json后大小寫保持不變)-->
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

 

  大功告成。

  說明:

  這里需要注意的是,使用谷歌的Gson將實體類轉json,key的名稱會完完全全照搬類的屬性名稱,但是,它只能完成實體類到json字符串的轉換,如果需要轉成json對象,再調用ali/net均可。

  如果不喜歡這種實現方式,還可以迭代json取值,將key的首字母轉大寫,也是可以噠。

4.Bug

  使用gson將實體類轉成json字符串的這種方式,會有一個弊端:

  如果實體類的屬性值,出現大於號、小於號、等號等符號時,調用GsonBuilder進行轉換時,這些符號會被強制轉換成unicode編碼,如下圖所示:

 

  解決方案,見文末推薦。 

2021-03-16

5.第二種解決方案

  使用Jackson也可以實現同樣的效果

  如果你的項目框架使用的是springboot的話,就無需引用jackjson的jar包了,springboot就是使用的jackjson完成json的序列化和反序列化的;

  如何驗證一下呢?

  在idea中,打開maven視圖

  實體類

  錯誤示例:

  我們會發現,首字母也全都被強制轉換成了小寫,是不是這就說明Jackson也不行?

  分析:

  正常情況下,在springboot中,為了解決前后端字段不一致的問題,我們通常在實體類接收前端請求參數或者響應給前端參數時,通常使用@JsonProperty注解完成字段的映射問題。

  那么,我們是不是也可以這樣使用呢,一起來試一下

  正確示例:

try {
    Result result = new Result();
    result.setCode("200").setFormat("PDF").setMessage("成功");
    String jsonStr = new ObjectMapper().writeValueAsString(result);
    System.out.println(jsonStr);
} catch (JsonProcessingException e) {
    e.printStackTrace();
}

  這樣,Jackson在序列化時,就會取@JsonProperty注解所聲明的字段作為json的key。

  深入探究 

  Jackson的其它注解是不是也是可以使用呢?

  常用的還有@JsonFormat和@JsonIgnore

 

  執行結果如下:

  兩個注解都沒有生效,但如果將這個實體類直接返回給前端的話,springboot會作出注解對應的處理。

6.兩種方案對比   

  區別一:實體類屬性沒有賦值

  如果沒有賦值的屬性的數據類型是基礎數據類型(八種基本數據類型:byte,short,int,long,double,float,boolean,char),兩者都會自動為其屬性值設置默認值

  如果沒有賦值的屬性的數據類型是封裝類(非基本數據類型)

  Gson:該屬性就不會作為key出現

  Jackson:會自動填充值為null

  區別二:html編碼

  Gson:如果實體類的屬性值,出現大於號、小於號、等號等符號時,調用GsonBuilder進行轉換時,這些符號會被強制轉換成unicode編碼(當然,有解決訪問,見文末推薦)

  Jackson:不會對其進行編碼,保持原樣 

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM