首頁  >  文章  >  Java  >  解決SpringMVC 傳回Java8 時間JSON資料的格式化問題處理的詳解

解決SpringMVC 傳回Java8 時間JSON資料的格式化問題處理的詳解

黄舟
黄舟原創
2017-03-07 10:03:082229瀏覽

本篇文章主要介紹了解決SpringMVC 回傳Java8 時間JSON資料的格式化問題處理,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

有時在Spring MVC中返回JSON格式的response的時候會使用@ResponseBody註解,不過在處理java8中時間的時候會很麻煩,一般我們使用的HTTPMessageConverter是MappingJackson2HttpMessageConverter,它預設回傳的時間格式是這種:

"startDate" : {
  "year" : 2010,
  "month" : "JANUARY",
  "dayOfMonth" : 1,
  "dayOfWeek" : "FRIDAY",
  "dayOfYear" : 1,
  "monthValue" : 1,
  "hour" : 2,
  "minute" : 2,
  "second" : 0,
  "nano" : 0,
  "chronology" : {
   "id" : "ISO",
   "calendarType" : "iso8601"
  }
 }

##但是我們不會回傳這種給前端使用,針對LocalDate想要傳回的格式是2016-11-26,而LocalDateTime想要回傳的格式是2016-11-26 21:04:34這樣的資料。透過專案研究並查閱相關資料,這裡介紹下個人研究中實現的兩種方式。

解決方法一:

若是maven項目,在pom中引入下面的jar套件:

<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jsr310</artifactId>
   <version>2.8.5</version>
 </dependency>

然後在你想要JSON化的POJO欄位的get函數上加上一個@JsonSerializer註解,如下


import com.fasterxml.jackson.annotation.JsonFormat;

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
public LocalDateTime getBirthday() {
    return this.loginTime;
  }

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
public LocalDateTime getLastLoginTime() {
    return this.loginTime;
  }

這種方式的優點是可以針對特定域類型設定不同顯示方式,然而優點也是缺點,因為每個日期屬性都要手動添加,實際中日期屬性又是普遍必備,並且需要額外引入jsr310的jar包。

解決方法二:

繼承ObjectMapper來實作傳回json字串。 MappingJackson2HttpMessageConverter主要透過ObjectMapper來實作傳回json字串。這裡我們寫一個JsonUtil類,取得ObjectMapper以針對java8新的日期時間API,註冊對應的JsonSerializer8742468051c85b06f0a0af9e3e506b5c。

/**
 * json处理工具类
 * 
 * 
 */
@Component
public class JsonUtil {

  private static final ObjectMapper mapper;

  public ObjectMapper getMapper() {
    return mapper;
  }

  static {

    mapper = new ObjectMapper();

    SimpleModule module = new SimpleModule();
    module.addSerializer(LocalDate.class, new LocalDateSerializer());
    module.addSerializer(LocalTime.class, new LocalTimeSerializer());
    module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
    mapper.registerModule(module);
  }

  public static String toJson(Object obj) {
    try {
      return mapper.writeValueAsString(obj);
    } catch (Exception e) {
      throw new RuntimeException("转换json字符失败!");
    }
  }

  public <T> T toObject(String json, Class<T> clazz) {
    try {
      return mapper.readValue(json, clazz);
    } catch (IOException e) {
      throw new RuntimeException("将json字符转换为对象时失败!");
    }
  }
}

class LocalDateSerializer extends JsonSerializer<LocalDate> {

  private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

  @Override
  public void serialize(LocalDate value, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException {
    jgen.writeString(dateFormatter.format(value));
  }
}

class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {

  private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

  @Override
  public void serialize(LocalDateTime value, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException {
    jgen.writeString(dateTimeFormatter.format(value));
  }

}

class LocalTimeSerializer extends JsonSerializer<LocalTime> {

  private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");

  @Override
  public void serialize(LocalTime value, JsonGenerator jgen, SerializerProvider provider)
      throws IOException, JsonProcessingException {
    jgen.writeString(timeFormatter.format(value));

  }

}

然後在springmvc的設定檔中,再將f7ba1f27e11c63617ca69c495697dd74改為以下配置,設定一個新的json轉換器,將它的ObjectMapper物件設定為JsonUtil中的objectMapper對象,此轉換器比spring內建的json轉換器優先權更高,所以與json有關的轉換,spring會優先使用它。


<mvc:annotation-driven>
    <mvc:message-converters>
      <bean
        class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
        <property name="objectMapper" value="#{jsonUtil.mapper}" />
        <property name="supportedMediaTypes">
          <list>
            <value>application/json;charset=UTF-8</value>
          </list>
        </property>
      </bean>
    </mvc:message-converters>
  </mvc:annotation-driven>

然後java8中的幾個日期和時間類型就可以正常友善的顯示了。優點是全域統一管理日期和時間等類型,缺點對pojo中的某個域做特殊處理。


 以上就是解決SpringMVC 返回Java8 時間JSON資料的格式化問題處理的詳解的內容,更多相關內容請關注PHP中文網(www.php.cn)!



#

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn