從json-lib轉成jackson的遇到的問題

来源:https://www.cnblogs.com/lightarc/archive/2019/01/10/jsontestq.html
-Advertisement-
Play Games

從json-lib轉成jackson的遇到的問題 問題一:json 字元串,再經過Jackson序列化之後就變成原生字元串了。而json-lib經過再序列化之後,還是json格式的串。 針對這種情況,可以寫一個Serializer類,遇到json串的時候就當作原生字元串寫入即可。 <<JsonStr ...


從json-lib轉成jackson的遇到的問題

問題一:json 字元串,再經過Jackson序列化之後就變成原生字元串了。而json-lib經過再序列化之後,還是json格式的串。

針對這種情況,可以寫一個Serializer類,遇到json串的時候就當作原生字元串寫入即可。

<<JsonStringSerializer>>

 /**
 * 序列化時,對Json格式的字元串做特殊處理:不用引號括起來
 * @author
 *
 */
public class JsonStringSerializer extends JsonSerializer<Object> {
    
    @Override
    public void serialize(Object value, JsonGenerator jgen, SerializerProvider provider) throws IOException {
        
        if (value == null) {
            jgen.writeNull();
        } else {
            if (value instanceof String) {
                String newValue = ((String) value).trim();
                // 只對Json格式的字元串做處理
                if (newValue.startsWith("{") || newValue.startsWith("[")) {
                    jgen.writeRawValue((String) value);
                } else {
                    jgen.writeObject(value);
                }
            } else {
                jgen.writeObject(value);
            }
        }
    }
}

 

問題二、jackson和json-lib對null值的處理大不相同。對於值為null的字元串類型的欄位,jackson輸出null,而json-lib輸出空字元串。對於List類型,json-lib輸出空列表[],而jackson還是輸出null。

如果是從json-lib移植到jackson,為了相容老代碼,可以寫一個SerializerProvider,遇到null值輸出空字元串等。

<<NullToEmptyStringProvider>>

 /**
 * Customize the DefaultSerializerProvider so that when it is looking for a
 * NullSerializer it will use one that is class sensitive, writing strings as ""
 * and everything else using the default value.
 *
 * @author
 */
public class NullToEmptyStringProvider extends DefaultSerializerProvider {

    private static final long serialVersionUID = -1L;

    // A couple of constructors and factory methods to keep the compiler happy
    public NullToEmptyStringProvider() {
        super();
    }

    public NullToEmptyStringProvider(NullToEmptyStringProvider provider, SerializationConfig config,
            SerializerFactory jsf) {
        super(provider, config, jsf);
    }

    @Override
    public NullToEmptyStringProvider createInstance(SerializationConfig config, SerializerFactory jsf) {
        return new NullToEmptyStringProvider(this, config, jsf);
    }

    @Override
    public JsonSerializer<Object> findNullValueSerializer(BeanProperty property) throws JsonMappingException {
        if (property.getType().getRawClass().equals(String.class)) {
            return EmptyStringSerializer.INSTANCE;
        } else if ((property.getType().isArrayType() || property.getType().isCollectionLikeType())
                && !property.getType().isMapLikeType()) {
            return EmptyListSerializer.INSTANCE;
        } else if (property.getType().getRawClass().equals(Long.class)
                || property.getType().getRawClass().equals(Short.class)
                || property.getType().getRawClass().equals(Integer.class)
                || property.getType().getRawClass().equals(Double.class)
                || property.getType().getRawClass().equals(Float.class)
                || property.getType().getRawClass().equals(BigDecimal.class)) {
            return EmptyNumberSerializer.INSTANCE;
        } else {
            return super.findNullValueSerializer(property);
        }
    }
}

/**
 * Output null of String to empty string.
 *
 * @author
 *
 */
class EmptyStringSerializer extends JsonSerializer<Object> {

    public static final JsonSerializer<Object> INSTANCE = new EmptyStringSerializer();

    private EmptyStringSerializer() {
    }

    // Since we know we only get to this seralizer in the case where the value
    // is null and the type is String, we can
    // do our handling without any additional logic and write that empty string
    // we are so desperately wanting.
    @Override
    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
            throws IOException {

        jsonGenerator.writeString("");
    }
}

/**
 * For null list
 * @author
 *
 */
class EmptyListSerializer extends JsonSerializer<Object> {

    public static final JsonSerializer<Object> INSTANCE = new EmptyListSerializer();

    private EmptyListSerializer() {
    }

    // Since we know we only get to this seralizer in the case where the value
    // is null and the type is String, we can
    // do our handling without any additional logic and write that empty string
    // we are so desperately wanting.
    @Override
    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
            throws IOException {
        jsonGenerator.writeStartArray();
        jsonGenerator.writeEndArray();
    }
}

/**
 * For null Number, such as Integer, Long, Short ....
 * @author
 *
 */
class EmptyNumberSerializer extends JsonSerializer<Object> {

    public static final JsonSerializer<Object> INSTANCE = new EmptyNumberSerializer();

    private EmptyNumberSerializer() {
    }

    // Since we know we only get to this seralizer in the case where the value
    // is null and the type is String, we can
    // do our handling without any additional logic and write that empty string
    // we are so desperately wanting.
    @Override
    public void serialize(Object o, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
            throws IOException {
        jsonGenerator.writeNumber(0);
    }
}

 

最後,需要把這個provider配置到jackson的mapper實例中。

jsonMapper.setSerializerProvider(new NullToEmptyStringProvider());

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在web網頁中,尤其是某些提交表單操作,需要驗證文本框輸入內容,本文利用文本框鍵盤事件和事件對象,對文本框只允許輸入數字方法進行總結。 1.鍵盤事件 keydown >鍵盤按下事件 keydown的時候,我們所按的鍵並沒有落入文本框 keyup >鍵盤彈起事件 keyup的時候,我們所按的鍵已經落入 ...
  • //查詢圖表數據 function GetData() { var qs = $("#qs").val(); var js = $("#js").val(); $.ajax({ url: '/YCGL_YCYSJLHIS/GetErrorOperate', type: 'GET', data: { ...
  • $('#a')是返回一個jquery對象 $('#a')[0]是一個element對象 document.getElementById('a') return 一個element對象 ...
  • 微信小程式更新以後今天<radio>全部變成垂直排列了,佈局亂了。 一開始嘗試給外層<view>添加display:flex;flex-direction:row;未果。 後來在開發者社區查找,發現是微信更新後的bug,很多線上的項目都受影響了。 解決: 1、在<radio-group>里添加包一個 ...
  • 分析: 外層邊框是瀏覽器邊框,內部盒子是頁面的一個盒子,綠點是盒子中滑鼠的位置。滑鼠相對盒子邊框的坐標=頁面中(註意不是瀏覽器)滑鼠坐標-盒子相對於瀏覽器邊框的偏移量 第一步:求瀏覽器邊框位置 x=element.offsetLeft; y=element.offsetTop; 代碼如下: 第二步: ...
  • 把data裡面需要回顯的欄位,加入一個數組arr,然後用後臺傳過來的json里的數據,迴圈json去判定arr裡面有沒有沒有當前的對象的key,如果有就 ...
  • window 10 python 3 安裝flask 首先打開cmd命令執行視窗切換到Python安裝目錄的Script,輸入pip出現以下頁面 這裡我們使用virtualenv虛擬開發環境 為什麼使用virtualenv? 1、使用不同應用開發環境獨立開發 2、環境升級不影響其他應用,也不會影響全 ...
  • Redis中的大集合對象,如set、zset等,如果有上千萬個元素,一般是不能直接用del命令來刪除的,因為del命令可能會耗時幾秒鐘,而redis本身是單線程的,在高併發的情況下會阻塞大量的請求,嚴重時可能引起雪崩。 那我們要怎麼來刪除它呢? 這裡我們給出一個解決方案,即結合lua腳本來實現刪除大 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...