zoukankan      html  css  js  c++  java
  • 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"}
    
  • 相关阅读:
    014-More than one file was found with OS independent path 'META-INF/DEPENDENCIES'
    013-一个Activity怎么调用另一个Activity的方法返回数据(转)
    012-关于EditText中的getText()方法的返回值类型以及string的转换问题(转)
    011-frament中不能调用getSystemService()方法
    010-Android开发解决控件超出屏幕,不能正常显示的问题
    009-在Fragment中实现Activity跳转功能
    Oracle分区表
    Oracle构造列
    Oracle集合
    Oracle多对多、维表
  • 原文地址:https://www.cnblogs.com/jiangdewen/p/15108716.html
Copyright © 2011-2022 走看看