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