为了账号安全,请及时绑定邮箱和手机立即绑定

如何动态自定义日期格式的反序列化器?

如何动态自定义日期格式的反序列化器?

茅侃侃 2022-07-06 09:45:26
我正在研究自定义JSON反序列化器并拥有以下课程public class yyyy_MM_dd_DateDeserializer extends StdDeserializer <LocalDate> { public yyyy_MM_dd_DateDeserializer() {  this(null); } public yyyy_MM_dd_DateDeserializer(Class t) {  super(t); } @Override public LocalDate deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {  String dateString = jsonParser.getText();  LocalDate localDate = null;  try {   localDate = LocalDate.parse(dateString, "yyyy-MM-dd");  } catch (DateTimeParseException ex) {   throw new RuntimeException("Unparsable date: " + dateString);  }  return localDate; }}在我的请求课程中@Valid@JsonDeserialize(using = LocalDateDeserializer.class)@JsonSerialize(using = LocalDateSerializer.class)private LocalDate endDate;它工作正常,但我想知道我是否可以动态传递日期格式。而不是硬编码在yyyy_MM_dd_DateDeserializer. 我想从我的请求类中传递日期格式,以便我的反序列化器更通用,任何人都可以通过发送所需的格式来使用它。
查看完整描述

3 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

我认为你工作太努力了,没有得到你想要的。有一种更简单的方法,无需编写自己的反序列化器。看看这个问题。本质上它看起来像


@JsonFormat(shape= JsonFormat.Shape.STRING, pattern="EEE MMM dd HH:mm:ss Z yyyy")

@JsonProperty("created_at") 

ZonedDateTime created_at;

而你只是戴上你自己的面具。另外,我曾经有一个任务是解析未知格式的日期,本质上我需要解析任何有效的日期。这是一篇描述如何实现它的想法的文章:Java 8 java.time package: parsing any string to date。你可能会发现它很有用


查看完整回答
反对 回复 2022-07-06
?
墨色风雨

TA贡献1853条经验 获得超6个赞

不是在使用活页夹库时(绑定的关键在于它不是动态的。)。

但是你可以在使用简单的解析库时,比如 org.json


查看完整回答
反对 回复 2022-07-06
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

当您使用java.time.*类并且Jackson最好从JavaTimeModule来自jackson-datatype-jsr310模块的注册开始。我们可以扩展它并使用提供的模式注册序列化程序,如下例所示:


import com.fasterxml.jackson.databind.ObjectMapper;

import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;


import java.time.LocalDate;

import java.time.format.DateTimeFormatter;


public class JsonApp {


    public static void main(String[] args) throws Exception {

        ObjectMapper mapperIso = createObjectMapper("yyyy-MM-dd");

        ObjectMapper mapperCustom0 = createObjectMapper("yyyy/MM/dd");

        ObjectMapper mapperCustom1 = createObjectMapper("MM-dd-yyyy");


        System.out.println(mapperIso.writeValueAsString(new Time()));

        System.out.println(mapperCustom0.writeValueAsString(new Time()));

        System.out.println(mapperCustom1.writeValueAsString(new Time()));

    }


    private static ObjectMapper createObjectMapper(String pattern) {

        JavaTimeModule javaTimeModule = new JavaTimeModule();

        javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(pattern)));


        ObjectMapper mapper = new ObjectMapper();

        mapper.registerModule(javaTimeModule);


        return mapper;

    }

}


class Time {


    private LocalDate now = LocalDate.now();


    public LocalDate getNow() {

        return now;

    }


    public void setNow(LocalDate now) {

        this.now = now;

    }


    @Override

    public String toString() {

        return "Time{" +

                "now=" + now +

                '}';

    }

}

Aboce 代码打印:


{"now":"2019-02-24"}

{"now":"2019/02/24"}

{"now":"02-24-2019"}


查看完整回答
反对 回复 2022-07-06
  • 3 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信