一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 解決SpringMVC 返回Java8 時間JSON數(shù)據(jù)的格式化問題處理

解決SpringMVC 返回Java8 時間JSON數(shù)據(jù)的格式化問題處理

2020-08-06 15:11東小邪 Java教程

本篇文章主要介紹了解決SpringMVC 返回Java8 時間JSON數(shù)據(jù)的格式化問題處理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
"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這樣的數(shù)據(jù)。通過項目研究并查閱相關資料,這里介紹下個人研究中實現(xiàn)的兩種方式。

解決方法一:

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

?
1
2
3
4
5
<dependency>
   <groupId>com.fasterxml.jackson.datatype</groupId>
   <artifactId>jackson-datatype-jsr310</artifactId>
   <version>2.8.5</version>
 </dependency>

然后在你想要JSON化的POJO字段的get函數(shù)上加上一個@JsonSerializer注解,如下

?
1
2
3
4
5
6
7
8
9
10
11
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;
  }

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

解決方法二:

繼承ObjectMapper來實現(xiàn)返回json字符串。MappingJackson2HttpMessageConverter主要通過ObjectMapper來實現(xiàn)返回json字符串。這里我們編寫一個JsonUtil類,獲取ObjectMapper以針對java8中新的日期時間API,注冊相應的JsonSerializer<T>。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
/**
 * 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("轉(zhuǎn)換json字符失敗!");
    }
  }
 
  public <T> T toObject(String json, Class<T> clazz) {
    try {
      return mapper.readValue(json, clazz);
    } catch (IOException e) {
      throw new RuntimeException("將json字符轉(zhuǎn)換為對象時失敗!");
    }
  }
}
 
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的配置文件中,再將<mvc:annotation-driven/>改為以下配置,配置一個新的json轉(zhuǎn)換器,將它的ObjectMapper對象設置為JsonUtil中的objectMapper對象,此轉(zhuǎn)換器比spring內(nèi)置的json轉(zhuǎn)換器優(yōu)先級更高,所以與json有關的轉(zhuǎn)換,spring會優(yōu)先使用它。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<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中的幾種日期和時間類型就可以正常友好的顯示了。優(yōu)點是全局統(tǒng)一管理日期和時間等類型,缺點對pojo中的某個域做特殊處理。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://www.cnblogs.com/jicp/p/6387757.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 九九免费精品视频 | 免费精品一区二区三区在线观看 | 波多野结衣无码 | 亚洲国产成人久久精品hezyo | 99精品国产成人一区二区 | 成人不卡在线 | 蜜桃在线 | sao虎影院桃红视频在线观看 | 嫩草成人国产精品 | 成人在线观看一区 | 亚洲成人国产精品 | 国产在线成人a | 日本成人高清视频 | 成人18视频在线观看 | 精品推荐国产麻豆剧传媒 | 欧美日韩国产在线人成 | 王小军怎么了最新消息 | 洗濯屋H纯肉动漫在线观看 武侠艳妇屈辱的张开双腿 午夜在线观看免费观看 视频 | 亚洲欧美一级夜夜爽w | 久久成人永久免费播放 | 91国内精品久久久久影院优播 | 9191精品国产观看 | 视频一区在线免费观看 | 亚洲精品视频在线 | 亚洲精品6久久久久中文字幕 | 青青在线视频观看 | 天天操天天干天天舔 | 精品一区二区三区 不卡高清 | 欧美理论片手机在线观看片免费 | 天天操天天干天天 | 短篇最污的乱淫伦小说全集 | 欧美黑人性猛交╳xx╳动态图 | 超级碰碰青草免费视频92 | 国产微拍精品一区 | 免费大片| 久久99国产亚洲高清观着 | 无遮掩60分钟从头啪到尾 | 国产精品久久久久久久久 | 人与动人物性行为zozo共患病 | 99久久免费国产精品热 | 日韩精品欧美国产精品亚 |