Java對象中時間格式 JSON序列化的處理


Java對象中時間格式 JSON序列化的處理

今天有個數據存es的需求。數據入es之前需要先進行JSON序列化輸出,便於開發校驗數據正確與否。同時也能確保入ES的數據正確與否。
以下這個方案只能作為一個解決問題的嘗試思路,因為Spring家族的序列化設置一直在變,2.5.3版本就有了個 spring.mvc.format.* 配置。

// 基礎實體
@Builder
public class DemoEntity {
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime localDateTime;

    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate localDate;

    @JsonFormat(pattern = "HH:mm:ss")
    @DateTimeFormat(pattern = "HH:mm:ss")
    private LocalTime localTime;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date dateTime;

    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date date;

    @JsonFormat(pattern = "HH:mm:ss")
    @DateTimeFormat(pattern = "HH:mm:ss")
    private Date time;
}

問題方案一: fastJSON

由阿里開源的fastJSON,使用簡單無腦。但是並無法事項我們所需的效果。但是針對LocalDateTime的序列化無法指定格式,且會把對象值為null的屬性刪掉。(例如:如果有的People對象的sex屬性為null,那么序列化的json會沒有sex這個key。創建時間設置類型為LocalDateTime,那么序列化的字符串必定為 "yyyy-MM-dd't'HH:mm:ss" 格式。

// 偽代碼
System.out.println(JSON.toJSONString(DemoEntity.getLocalDateTime()));
// 效果: *** "localDateTime":"2021-07-06T11:19:26" **

成功方案二:jackSon,Spring Mvc默認內置使用。

import com.alibaba.fastjson.JSON;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.log4j.Log4j2;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.Date;

/**
 * @author ListJiang
 * @since 2021/8/6 14:31
 * description
 */
@RestController
@Log4j2
public class Demo {
    @RequestMapping("/elastic/test")
    public DemoEntity test(@RequestBody DemoEntity demoEntity) throws JsonProcessingException {
        ObjectMapper objectMapper = new ObjectMapper();
        // 未執行改方法 localDateTime 會序列化為Json對象而不是指定格式字符串
        objectMapper.findAndRegisterModules();
        System.out.println("fastJson:    " + JSON.toJSONString(demoEntity));
        System.out.println("jackson:     " + objectMapper.writeValueAsString(demoEntity));

        return new DemoEntity(LocalDateTime.now(), LocalDate.now(),
                LocalTime.now(),
                new Date(),
                new Date(),
                new Date());
    }
}

// 效果:
// fastJson:    {"date":1628179200000,"dateTime":1628232915000,"localDate":"2021-08-06","localDateTime":"2021-08-06T14:55:15","localTime":"14:55:15","time":24915000}
// jackson:     {"localDateTime":"2021-08-06 14:55:15","localDate":"2021-08-06","localTime":"14:55:15","dateTime":"2021-08-06 06:55:15","date":"2021-08-05","time":"06:55:15"}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM