Java 如何动态定制日期格式的反序列化程序?

Java 如何动态定制日期格式的反序列化程序?,java,json,json-deserialization,localdate,Java,Json,Json Deserialization,Localdate,我正在使用自定义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 publi

我正在使用自定义
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;
 }
}
它工作得很好,但我想知道是否可以动态传递日期格式。而不是在
yyyy\u MM\u dd\u日期反序列化器中进行硬编码

我想从我的请求类中传递日期格式,以便我的反序列化程序更通用,任何人都可以通过发送所需格式来使用它。

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


但是当你使用一个简单的解析库,比如org.json的时候,你就可以了。我认为你太努力了,无法得到你想要的。有一种更简单的方法不用编写自己的反序列化程序。看看从本质上看

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

你只要戴上你自己的面具。另外,我曾经有一个任务,解析未知格式的日期,本质上我需要解析任何有效的日期。下面是一篇描述如何实现它的文章:。当您使用
java.time.*
类和
Jackson
时,您可能会发现它很有用,从注册来自模块的
JavaTimeModule
开始很好。我们可以扩展它并使用提供的模式注册serialiser,如以下示例所示:

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"}

谢谢,在我的情况下,格式是“yyyy-MM-dd”,如果我发送“12-31-2019”,它将转换为有效日期。但我需要一个错误,日期格式是错误的。因此创建了CustomDateDeserializer
{"now":"2019-02-24"}
{"now":"2019/02/24"}
{"now":"02-24-2019"}