利用ObjectMapper將javabean轉爲json

在java服務端實體對象和json之間進行相互轉換的時候,常用到的框架有json-lib,Jackson,fastjson,gson等等。以前用gson比較多,而且gson在很多情況下的確表現不俗,不過在做一段時間的服務端之後,發現在將Hibernate實體對象和json互轉的時候,繼續使用gson便有些不便了,而Spring框架裏面再帶的Jackson則很容易做到。


使用gson將Hibernate實體對象轉爲json主要存在以下幾方面的難點:

1、Hibernate對象裏的有些字段的fetchType是採用LAZY加載的模式,這樣做的好處是沒有用到該屬性的時候不會觸發數據庫查詢,節約服務器資源,不過節約了服務器資源,在轉換時可就是問題了。因爲轉換時那些LAZY字段其實並沒有值,所以會出現轉換錯誤。解決方法是要麼將fetchType改爲EARGLY,要麼是用Expose註解,將需要轉換的字段標註出來,使用new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();創建Gson對象,沒有@Expose註釋的屬性將不會被序列化,這樣就不會報錯了。

2、Hibernate對象可能會存在相互關聯,在序列化的時候導致循環引用,無窮無盡,最終產生StackOverFlow的錯誤,也就是內存溢出。使用gson具體怎麼解決有幾種方式,包括受用@Transient註解,@Expose註解,自定義Gson序列生成器等等,就不一一贅述了。


雖然Gson在其他方面和某些性能上面也非常出衆,但是Jackson在解析Hibernate實體對象的時候有着自己獨特的優勢。

首先,創建一個ObjectMapper對象,這個對象是用來作屬性轉換的映射的;創建完ObjectMapper對象後爲這個對象添加過濾器,new SimpleFilterProvider().addFilter(filterName,SimpleBeanPropertyFilter.filteAllExcept()),添加需要序列化的字段。如果序列話輸出的屬性鍵名和實體對象的屬性名不一致的話,可以創建一個抽象類或者接口,將需要轉換的屬性名列出來,使用@JsonProperty()abstract String getXXX();註解,括號裏面寫需要輸出的鍵名,getXXX是對應屬性的getter方法。然後用ObjectMapper的addMixInAnnotations(traget.class,MixIn.class)方法轉換輸出鍵名。

另外,如果要在序列話輸出的時候對某些屬性進行特殊的處理的話,可以在實體類裏面的對應屬性上面加上@JsonSerializer(using = CustomSerializer.class)註解,CustomSerializer是自定義的序列器,繼承自JsonSerializer<T>,用於對屬性值進行處理後序列化輸出。

最後,在遇到屬性值爲空——即不存在的時候,我們通常是輸出爲一個空字符串"",這時候用ObjectMapper的getSerializerProvider.setNullValueSerializer()方法,裏面實現過程爲:jsonGenerator.writeString("");這樣就能將空值轉爲空字符竄輸出了,當然,也可以輸出成其他的值。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章