jackson 自定義解析類,處理複雜型別
本文簡介
當jackson預設的解析方法不能成功將你的物件轉換成json時,需要自定義解析器,去解決這個問題。可以自己轉換成json,也可以把自己的物件轉換成jackson能處理的物件。比如把 Multimap 轉換成 Map。
引出問題
jackson預設的解析方法基本夠大多數我使用了,但是有時候會遇到有一些情況,它不能解析的。會得到結果{"empty":false}
,在這種情況下,我們需要自定義處理方法。
問題說明
我們知道Map是 key-value 型別的,如果一個Map<String,String>
,這樣子的話,多次put 同一個key,會覆蓋掉前面的value,但是有些情況下我們需要多個value,這時我們會用到 google guava 包下面的 Multimap 類,這個類的value,預設是個集合,多次put會自動新增到value的集合中而不會覆蓋。
但是在 SpringMVC
@ResponseBody
的返回值是由 org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
類處理的,這時會出現問題。
jackson預設不支援Multimap類,所以轉換結果就是 {"empty":false}
,這並不是我們想要的。
解決方法
jackson中有註解 @JsonSerialize
,此註解中有兩個值是我們需要使用的。使用方法如下:
public class Bean{
//處理List的泛型
@JsonSerialize(contentUsing = MultiMapSerializer.class)
private List<Multimap> list;
//處理屬性本身
@JsonSerialize(using = MultiMapSerializer.class)
private Multimap map;
}
如上兩種方法,一個是處理泛型,一個是處理屬性。只需要新增在你的bean的屬性上即可,另外需要再新增一個MultiMapSerializer類。
MultiMapSerializer類是參照 MapSerializer 實現的。
package com.util.jackson;
import com.fasterxml.jackson.core.JsonGenerationException;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
import com.fasterxml.jackson.databind.ser.ContainerSerializer;
import com.google.common.collect.Multimap;
import java.io.IOException;
import java.util.Map;
/**
* 此類用於讓jackson可以解析google guava 的 multimap, 而不至於出現 {"empty":false} 這樣的結果
* 使用方法:在 Multimap的屬性上新增 @JsonSerialize(using = MultiMapSerializer.class)
* 在Multimap作為泛型的屬性上(如List<Multimap>)新增 @JsonSerialize(contentUsing = MultiMapSerializer.class)
* <p/>
* Created by liuyibo on 15/9/8.
* E-Mail:[email protected]
*/
public class MultiMapSerializer extends ContainerSerializer<Multimap<?, ?>> {
public MultiMapSerializer() {
super(Map.class, false);
}
@Override
public JavaType getContentType() {
return null;
}
@Override
public JsonSerializer<?> getContentSerializer() {
return null;
}
@Override
public boolean isEmpty(Multimap<?, ?> value) {
return false;
}
@Override
public boolean hasSingleElement(Multimap<?, ?> value) {
return false;
}
@Override
protected ContainerSerializer<?> _withValueTypeSerializer(TypeSerializer vts) {
return null;
}
@Override
public void serialize(Multimap<?, ?> value, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonGenerationException {
//這裡直接把value轉換成map,jackson能處理map,交給它去處理
jgen.writeObject(value.asMap());
}
}
在這個類裡只需要寫好建構函式,並在serialize(Multimap<?, ?> value, JsonGenerator jgen, SerializerProvider provider)
方法中寫好處理方法就可以了。
處理方法有兩種:一種是自己轉換成json,寫入到JsonGenerator jgen
物件中。
另一種是把自己的物件轉換成jackson能處理的物件。
這裡我使用第二種。
推薦使用第二種,可以避免發生不可預料的錯誤。
總結
寫得好的程式碼,寫得好的框架,或者工具,都是可擴充套件的。而可擴充套件的程式碼,在一開始看的時候總是會有各種各樣不理解的東西出現在眼前。看得多了就能看懂了,但是最重要的還是要思考,看看別人怎麼寫的,如何能在自己的程式碼中,也可以實現輕鬆自如的擴充套件。
可能一開始你的想法並不會被所有人理解,你要習慣,你要堅持,同時也要面對自己的錯誤,你會被別人認可的,只是並不會從一開始就會。
相關推薦
jackson 自定義解析類,處理複雜型別
本文簡介 當jackson預設的解析方法不能成功將你的物件轉換成json時,需要自定義解析器,去解決這個問題。可以自己轉換成json,也可以把自己的物件轉換成jackson能處理的物件。比如把 Multimap 轉換成 Map。 引出問題 jackso
springmvc在處理請求過程中出現異常資訊交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。為了區別不同的異常通常根據異常型別自定義異常類,這裡我們建立一個自定義系統異常,如果controller、service、dao丟擲此類異常說明是系統預期處理的異常資訊。
springmvc在處理請求過程中出現異常資訊交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。 1.1 異常處理思路 系統中異常包括兩類:預期異常和執行時異常RuntimeException,前者通過捕獲異常從而獲取異常資訊,後者主要通過規範程式碼開發、測試通過手段減少執
springmvc在處理請求過程中出現異常信息交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。為了區別不同的異常通常根據異常類型自定義異常類,這裏我們創建一個自定義系統異常,如果controller、service、dao拋出此類異常說明是系統預期處理的異常信息。
ansi req -type this spring 進行 name ext code springmvc在處理請求過程中出現異常信息交由異常處理器進行處理,自定義異常處理器可以實現一個系統的異常處理邏輯。 1.1 異常處理思路 系統中異常包括兩類:預期異常和運行時異常Ru
設計一個 Java 程式,自定義異常類,從命令列(鍵盤)輸入一個字串,如果該字串值為“XYZ”。。。
設計一個 Java 程式,自定義異常類,從命令列(鍵盤)輸入一個字串,如果該字串值為“XYZ”,則丟擲一個異常資訊“This is a XYZ”,如果從命令列輸入 ABC,則沒有丟擲異常。(只有 XYZ 和 ABC 兩種輸入)。 class xyz { public void test(S
log4j自定義appender實現,處理異常堆疊
在專案中需要自定義實現一個log4j的appender。根據log中MDC裡的資訊,構造日誌儲存的目錄結構。自定義實現log4j appender的方法已經介紹過了。主要是覆蓋AppenderSkeleton中的appender方法。 @Ove
spring 自定義解析類
設計配置屬性和JavaBean 編寫XSD檔案 編寫NamespaceHandler和BeanDefinitionParser完成解析工作 編寫spring.handlers和spring.schemas串聯起所有部件 在Bean檔案中應用 會用到N
使用HashMap,如果key是自定義的類,就必須重寫hashcode()和equals()
hashcode()和equals()都繼承於object,在Object類中的定義為:equals()方法在Object類中的定義:publicboolean equals(Object obj){ return (this== obj);}equals()的定義為:
多執行緒實現方式1:自定義一個類,繼承Thread類,並重寫run方法。
/** * 多執行緒實現方式1: * 自定義一個類,繼承Thread類,並重寫run方法。 * 執行緒同時執行。 * @author jiaxutianhuo * */ public cl
Android 自定義Dialog類,並在Activity中實現按鈕監聽。
實際開發中,經常會用到Dialog,比如退出時候會彈出是否退出,或者還有一些編輯框也會用Dialog實現,效果圖如下: 開發中遇到的問題無非在於如果在Activity中監聽這個Dialog中實現的按鈕,Dialog類如下,在MyDialog這個類中實現了一個LeaveMyDialogLi
安卓自定義View時,處理canvas縮放引起canvas.drawBitmap畫質降低
自定義view時,經常會用到圖片繪製,canvas.drawBitmap家族可以說是非常常用的API,不過有時候開發中要求我們的控制元件在某些頁面是一個比例,某些頁面是另一個顯示比例,例如我遇到的,item的角標,噗……又是這個,在主頁面是100%顯示,在列表頁
Java File類學習筆記4:自定義一個類,過濾指定副檔名的檔案
一、FilenameFilter介紹 java.io.File類提供了四個方法用於列舉某個路徑下的檔案和目錄,但不會遞迴列舉子目錄下的內容 其中兩個是列舉路徑下的所有檔案和目錄。 (1)String
使用HashMap,如果key是自定義的類,就必須重寫hashcode()和equals()。
hashcode()和equals()都繼承於object,在Object類中的定義為: equals()方法在Object類中的定義: publicboolean equals(Object obj){ return (this== obj); } eq
SpringMVC學習(一)引數繫結,自定義轉換器,處理請求亂碼
一、註解對映器和介面卡 1,元件掃描器 使用元件掃描器省去在spring容器配置每個controller類的繁瑣。 <!--開啟註解掃描 --> <context:component-scan base-package="com.
潭州課堂25班:Ph201805201 django框架 第五課 自定義簡單標籤,包含標籤,模型類建立,梳理類建立 (課堂筆記)
自定義標籤同自定義過渡器一樣,要建立檔案,在配置檔案中以APP方法註冊,對方法進註冊,在 html 檔案中引入,.. 由模板傳參 在 在配置檔案中改時區: 由檢視函式傳參 &nbs
MapReduce 自定義屬性類(輸出電話號對應的上行,下行流量及其總計,並排序)
MapReduce 自定義屬性類 注意要點: 無參構造方法 繼承 Writable類 重寫write() readFields()方法 相關錯誤: java.lang.Exception: java.lang.RuntimeExceptio
ByteBuf 一個用於在通訊中的資料解析傳輸組裝的自定義容器類
在做和硬體通訊的專案的時候,通訊的內容一般都是最基本的byte陣列,比如BLE,UART等等方式,傳遞的都是byte陣列。 移動端在接收的時候,就需要去解析byte陣列,然後從中通過拼接和或(|)以及位移等運算來得到想要的資料型別,比如說,unsignedByte,short,int,float
潭州課堂25班:Ph201805201 django框架 第十二課 自定義中介軟體,上下文處理,admin後臺 (課堂筆記)
中介軟體 在專案主目錄下的配置檔案 在專案主目錄下建立檔案 寫個自定義異常處理 方法1 要讓其生效,要在主目錄下,的中介軟體中進行註冊 主目錄下.該檔名.類名 在進入檢視函式之前進行判斷, 給 request 新增屬性 方法2
丟擲自定義的異常,異常處理中丟擲異常
你可以用raise語句來引發一個異常。異常/錯誤物件必須有一個名字,且它們應是Error或Exception類的子類 下面是一個引發異常的例子: class ShortInputException(Exception): ‘’‘自定義的異常類’’’ def init(self, le
Spring Boot自定義錯誤頁面,Whitelabel Error Page處理方式
Spring Boot以一種新的微服務的方式來替代以Spring Framework構建專案的傳統方式,我已經計劃在後續的專案開發中使用它。它已經幫我們做了90%的工作,剩下10%的工作需要我們自己去完成。對於我來說,自定義錯誤頁面就是其中之一。比如404錯誤,如果不
SpringMVC中的異常處理(全域性異常處理對自定義異常類進行統一處理)
前言: WEB開發中,總會有一些不可預料的錯誤,對於一些課預測的異常,我們可以自定義一個異常類,然後再載入個全域性異常處理器,對系統中出現的異常進行統一的處理。 注意:當你在Springmvc配置檔案中配置全域性異常處理器的時候,只要如下配置即可: <!