1. 程式人生 > >Jackson序列化與反序列化屬性總結

Jackson序列化與反序列化屬性總結

關於json 轉換BigDecimal精度丟失問題https://www.cnblogs.com/zyzcj/p/7841054.html

原文地址:https://www.cnblogs.com/jian-xiao/p/6009435.html?utm_source=itdadao&utm_medium=referral

第一章 JacksonUtil 序列化與反序列化屬性總結

1.json-lib與Jackson

  關於json-lib與Jackson對比總結如下:

  1).效能方面,Jackson的處理能力高出Json-lib10倍左右。

  2).json-lib已經停止更新,最新的版本也是基於JDK1.5,而Jackson的社群則較為活躍。

  3).json-lib依賴commons系列的包及 ezmorph包共 5個,而Jackson除自身的以外只依賴於commons-logging

 

2.1 Jackson序列化與反序列化方法

 View Code

 2.2 Jackson自動檢測機制

   jackson預設的欄位屬性發現規則如下:

    所有被public修飾的欄位->所有被public修飾的getter->所有被public修飾的setter

  若類中的一個private屬性,且沒有設定public的getter和setter方法,則對該類物件進行序列化時,預設不對這個private屬性進行序列化。

  若此時任然需要對該private屬性進行序列化,可以通過設定自動檢測功能來實現:

  2.2.1 通過配置屬性實現

 View Code

  2.2.2 使用@JsonAutoDetect(作用在類上)來開啟/禁止自動檢測  

    fieldVisibility:欄位的可見級別

    ANY:任何級別的欄位都可以自動識別

    NONE:所有欄位都不可以自動識別

    NON_PRIVATE:非private修飾的欄位可以自動識別

    PROTECTED_AND_PUBLIC:被protected和public修飾的欄位可以被自動識別

    PUBLIC_ONLY:只有被public修飾的欄位才可以被自動識別

    DEFAULT:同PUBLIC_ONLY

  @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY) 

3.序列化與反序列化屬性總結

  與json-lib相比,Jackson在序列化與反序列時,可以對序列化與反序列化進行配置,是的輸出結果滿足自己的要求。序列化與反序列化屬性很多,下面對一些常用屬性進行介紹。

  3.1 序列化屬性  

複製程式碼

        //這個特性,決定了解析器是否將自動關閉那些不屬於parser自己的輸入源。
        // 如果禁止,則呼叫應用不得不分別去關閉那些被用來建立parser的基礎輸入流InputStream和reader;
        //預設是true
        objectMapper.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, true);
        //是否允許解析使用Java/C++ 樣式的註釋(包括'/'+'*' 和'//' 變數)
        objectMapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);

        //設定為true時,屬性名稱不帶雙引號
        objectMapper.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false);
        //反序列化是是否允許屬性名稱不帶雙引號
        objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

        //是否允許單引號來包住屬性名稱和字串值
        objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);

        //是否允許JSON字串包含非引號控制字元(值小於32的ASCII字元,包含製表符和換行符)
        objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);

        //是否允許JSON整數以多個0開始
        objectMapper.configure(JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS, true);

        //null的屬性不序列化
        objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

        //按字母順序排序屬性,預設false
        objectMapper.configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY,true);

        //是否以類名作為根元素,可以通過@JsonRootName來自定義根元素名稱,預設false
        objectMapper.configure(SerializationFeature.WRAP_ROOT_VALUE,true);

        //是否縮放排列輸出,預設false
        objectMapper.configure(SerializationFeature.INDENT_OUTPUT,false);

        //序列化Date日期時以timestamps輸出,預設true
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,true);

        //序列化列舉是否以toString()來輸出,預設false,即預設以name()來輸出
        objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING, true);

        //序列化列舉是否以ordinal()來輸出,預設false
        objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_INDEX,false);

        //序列化單元素陣列時不以陣列來輸出,預設false
        objectMapper.configure(SerializationFeature.WRITE_ENUMS_USING_TO_STRING,true);

        //序列化Map時對key進行排序操作,預設false
        objectMapper.configure(SerializationFeature.ORDER_MAP_ENTRIES_BY_KEYS,true);

        //序列化char[]時以json陣列輸出,預設false
        objectMapper.configure(SerializationFeature.WRITE_CHAR_ARRAYS_AS_JSON_ARRAYS,true);

        //序列化BigDecimal時是輸出原始數字還是科學計數,預設false,即以toPlainString()科學計數方式來輸出
        objectMapper.configure(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN,true);

複製程式碼

 

  下面寫一個Person類,對上面介紹的序列化屬性進行測試,並進行直觀輸出:  

 View Code

  下面是測試類:

 View Code

  3.2 反序列化屬性

 View Code

   3.3 Jackson序列化和反序列化註解 

  上面的配置是針對所有類的反序列化的設定,下面介紹針對某個類的屬性和方法的反序列化的註解:

  1. @JsonIgnore:作用在欄位或方法上,用來完全忽略被註解的欄位和方法對應的屬性。

    [email protected]:作用在欄位或方法上,用來對屬性的序列化/反序列化,可以用來避免遺漏屬性,同時提供對屬性名稱重新命名。

    對屬性添加了@JsonProperty註解後,即使該屬性為private且沒有getter和setter方法,也會進行序列化。

  [email protected]

     作用在類上,用來說明有些屬性在序列化/反序列化時需要忽略掉,可以將它看做是@JsonIgnore的批量操作,它還有一個重要的功能是作用在反序列化時解析欄位時過濾一些未知的屬性,否則通常情況下解析到我們定義的類不認識的屬性便會丟擲異常。

    可以註明是想要忽略的屬性列表如@JsonIgnoreProperties({"name","age","title"}),

    也可以註明過濾掉未知的屬性如@JsonIgnoreProperties(ignoreUnknown=true)

  4、@JsonUnwrapped作用在屬性欄位或方法上,用來將子JSON物件的屬性新增到封閉的JSON物件。示例如下:

 View Code

  [email protected]和@JsonDeserialize:作用於方法和欄位上,通過 using(JsonSerializer)和using(JsonDeserializer)來指定序列化和反序列化的實現。下面的例子中自定義了日期的序列化和反序列化方式,可以將Date和指定日期格式字串之間相互轉換。 

@JsonSerialize(using = MyDateSerializer.class)  
@JsonDeserialize(using = MyDateDeserializer.class)  
private Date birthday; 

  [email protected]:作用在類上,被用來指明當序列化時需要對屬性做排序。@jsonPropertyOrder(alphabetic = true)

  [email protected]:檢視模板,作用於方法和屬性上,用來指定哪些屬性可以被包含在JSON檢視中,在前面我們知道已經有@JsonIgnore和@JsonIgnoreProperties可以排除過濾掉不需要序列化的屬性,可是如果一個POJO中有h很多個屬性,而我們可能只需要概要簡單資訊即序列化時只想輸出其中幾個屬性,此時使用@JsonIgnore和@JsonIgnoreProperties就顯得非常繁瑣,而使用@JsonView便會非常方便,只許在你想要輸出的屬性(或對應的getter)上新增@JsonView即可。

 View Code

  [email protected]:Json屬性過濾器,作用於類,作用同上面的@JsonView,都是過濾掉不想要的屬性,輸出自己想要的屬性。和@FilterView不同的是@JsonFilter可以動態的過濾屬性。eg:

 View Code

  定義了一個名為myFilter的SimpleFilterProvider,這個過濾器將會過濾掉所有除a屬性以外的屬性。

  [email protected]:作用於方法,在反序列化時用來處理遇到未知的屬性的時候呼叫,在本文前面我們知道可以通過註解@JsonIgnoreProperties(ignoreUnknown=true)來過濾未知的屬性,但是如果需要這些未知的屬性該如何是好?那麼@JsonAnySetter就可以派上用場了,它通常會和map屬性配合使用用來儲存未知的屬性, 

 View Code

  3.4 Jackson序列化設定DateTime的輸出格式:

  simpleModule.addSerializer(new JodaDateSerializer(DateTime.class));

  JodaDateSerializer類的程式碼如下:

 View Code

 DateTimeUtils是自己定義的進行DateTime和各種String格式轉換的工具類,程式碼見 第二章 DateTime工具類

 

  參考部落格:http://blog.csdn.net/sdyy321/article/details/40298081#t30