1. 程式人生 > >Jackson 轉換JSON,SpringMVC ajax 輸出,當值為null或者空不輸出欄位@JsonInclude

Jackson 轉換JSON,SpringMVC ajax 輸出,當值為null或者空不輸出欄位@JsonInclude

當我們提供介面的時候,  Ajax  返回的時候,當物件在轉換  JSON  (序列化)的時候,值為Null 或者為“”的欄位還是輸出來了。看上去不優雅。

現在我敘述三種方式來控制這種情況。

註解的方式( @JsonInclude(JsonInclude.Include.NON_EMPTY))

通過@JsonInclude 註解來標記,但是值的可選項有四類。

  1. Include.Include.ALWAYS (Default / 都參與序列化) 
  2. Include.NON_DEFAULT
    (當Value 為預設值的時候不參與,如Int a; 當 a=0 的時候不參與)
  3. Include.NON_EMPTY(當Value 為“” 或者null 不輸出)
  4. Include.NON_NULL(當Value 為null 不輸出)

註解使用如下:

 
  1. ... ...
  2.  
  3. //如果是null 和 “” 不返回
  4. @JsonInclude(JsonInclude.Include.NON_EMPTY)
  5. private T data;
  6.  
  7. ... ...

我的物件定義(其實就是一個API介面的返回物件):

 
  1. public class APIResult<T> implements Serializable {
  2. //狀態
  3. private Integer status;
  4. //描述
  5. private String message;
  6.  
  7. //如果是null 不返回
  8. @JsonInclude(JsonInclude.Include.NON_EMPTY)
  9. private T data;
  10. /*** getter / setter***/
  11. }

我的前端返回值:

 
  1. {"status":200,"message":"success"}

如上,基本達到我的要求了。

程式碼方式:

 
  1. ObjectMapper mapper = new ObjectMapper();
  2. //null不序列化
  3. mapper.setSerializationInclusion(Include.NON_NULL);
  4.  
  5. Demo demo = new Demo(200,"",null);
  6. String json = mapper.writeValueAsString(demo);
  7. System.out.println(json);
  8. //結果:{"st":200,"name":""} 為null的屬性沒輸出。

Spring配置檔案實現

當我們整個專案都需要某一種規則的時候,那麼我們就採用配置檔案配置。

先還是上一下  Jackson  的  Maven  配置:

 
  1. <dependency>
  2. <groupId>com.fasterxml.jackson.core</groupId>
  3. <artifactId>jackson-core</artifactId>
  4. <version>${jackson.version}</version>
  5. </dependency>
  6.  
  7. <dependency>
  8. <groupId>com.fasterxml.jackson.core</groupId>
  9. <artifactId>jackson-databind</artifactId>
  10. <version>${jackson.version}</version>
  11. </dependency>

再來一個XML配置:

 
  1. <bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper">
  2. <property name="serializationInclusion">
  3. <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
  4. </property>
  5. </bean>
  6. <mvc:annotation-driven>
  7. <mvc:message-converters>
  8. <bean
  9. class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
  10. <property name="objectMapper" ref="objectMapper" />
  11. </bean>
  12. </mvc:message-converters>
  13. </mvc:annotation-driven>

其實所有的姿勢都是針對  Jackson  提供給我們的入口“JsonInclude.Include” 來處理的。所以只要記住最上面講的幾個級別就可以了。