1. 程式人生 > >jackson 自定義解析類,處理複雜型別

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配置檔案中配置全域性異常處理器的時候,只要如下配置即可: <!