如何实现Java8 LocalTimeDeserializer?
How to implement Java 8 LocalTimeDeserializer?
我一直在寻找使用 Jackson API 的 LocalTimeDeserializer class 实现自定义解串器的方法。
但是,在实际使用此 class.
反序列化属性时,我遇到了以下错误
com.fasterxml.jackson.databind.JsonMappingException: Class com.dspim.api.common.LocalTimeWithStringDeserializer has no default (no arg) constructor
我正在使用下面的自定义实现在 bean 中反序列化 class。
@JsonProperty
@JsonDeserializer(using=LocalTimeWithStringDeserializer.class)
private LocalTime packaging_time; //It will hold value for time i.e. 13:24 (01:24 PM).
我已经实现了解串器 class 如下。
package com.testapp.test;
import java.io.IOException;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
public class LocalTimeWithStringDeserializer extends com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer{
public LocalTimeWithStringDeserializer(DateTimeFormatter formatter) {
super(formatter);
}
private static final long serialVersionUID = 1L;
@Override
public LocalTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
JsonProcessingException {
return LocalTime.parse(jp.getText());
}
}
父 class 中的默认构造函数(不带参数)是私有的,因此我无法将默认构造函数(不带参数)添加到我的 class 实现中,因为出现编译时错误.
请提出解决此问题的建议。
请注意: 我有两个不同的客户端项目(在 class 路径中添加了相互依赖),我无法在其中使用内置的由于依赖版本冲突,Jackson 反序列化器,这就是我被迫使用自定义反序列化器的原因。
如果父 class 有一个私有的 no-args 构造函数,这并不妨碍您自己拥有一个 no-args 构造函数:
public class LocalTimeWithStringDeserializer extends com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer{
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
public LocalTimeWithStringDeserializer() {
super(formatter);
}
// ...
}
也许您不需要自己的反序列化器。您需要做的就是使用以下注释对您的 LocalTime 成员进行注释:
static class Entity {
LocalTime time;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss")
public LocalTime getTime() {
return time;
}
}
这应该有效。查看此问题的答案:
我在我的项目中使用 LocalTime 反序列化器,link 它用于 JSOG/JSON 在调用 API 层时反序列化。我在要反序列化的字段上方的模型层中使用注释声明它。我使用 jackson.databind.JsonDeserializer
,它很适合我`。
这是我使用的代码:
import java.io.IOException;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
public class CustomJacksonLocalTimeDeserializer extends JsonDeserializer<LocalTime> {
@Override
public LocalTime deserialize(JsonParser jsonparser, DeserializationContext context)
throws IOException, JsonProcessingException {
String dateAsString = jsonparser.getText();
try {
return LocalTime.parse(dateAsString, DateTimeFormatter.ISO_LOCAL_TIME);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
您还需要在字段中注释如下:
@JsonDeserialize(using = CustomJacksonLocalTimeDeserializer.class)
@JsonSerialize(using = CustomJacksonLocalTimeSerializer.class)
@Column(columnDefinition = "TIMESTAMP")
private LocalTime origHardScheduledTime;
我知道,你并没有要求它,但为了完成,序列化程序看起来也很相似。
import java.io.IOException;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
public class CustomJacksonLocalTimeSerializer extends JsonSerializer<LocalTime> {
@Override
public void serialize(LocalTime date, JsonGenerator jsonGenerator, SerializerProvider serializers)
throws IOException, JsonProcessingException {
jsonGenerator.writeString(date.format(DateTimeFormatter.ISO_LOCAL_TIME));
}
}
我一直在寻找使用 Jackson API 的 LocalTimeDeserializer class 实现自定义解串器的方法。
但是,在实际使用此 class.
反序列化属性时,我遇到了以下错误com.fasterxml.jackson.databind.JsonMappingException: Class com.dspim.api.common.LocalTimeWithStringDeserializer has no default (no arg) constructor
我正在使用下面的自定义实现在 bean 中反序列化 class。
@JsonProperty @JsonDeserializer(using=LocalTimeWithStringDeserializer.class) private LocalTime packaging_time; //It will hold value for time i.e. 13:24 (01:24 PM).
我已经实现了解串器 class 如下。
package com.testapp.test;
import java.io.IOException;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
public class LocalTimeWithStringDeserializer extends com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer{
public LocalTimeWithStringDeserializer(DateTimeFormatter formatter) {
super(formatter);
}
private static final long serialVersionUID = 1L;
@Override
public LocalTime deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
JsonProcessingException {
return LocalTime.parse(jp.getText());
}
}
父 class 中的默认构造函数(不带参数)是私有的,因此我无法将默认构造函数(不带参数)添加到我的 class 实现中,因为出现编译时错误.
请提出解决此问题的建议。
请注意: 我有两个不同的客户端项目(在 class 路径中添加了相互依赖),我无法在其中使用内置的由于依赖版本冲突,Jackson 反序列化器,这就是我被迫使用自定义反序列化器的原因。
如果父 class 有一个私有的 no-args 构造函数,这并不妨碍您自己拥有一个 no-args 构造函数:
public class LocalTimeWithStringDeserializer extends com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer{
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd");
public LocalTimeWithStringDeserializer() {
super(formatter);
}
// ...
}
也许您不需要自己的反序列化器。您需要做的就是使用以下注释对您的 LocalTime 成员进行注释:
static class Entity {
LocalTime time;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "HH:mm:ss")
public LocalTime getTime() {
return time;
}
}
这应该有效。查看此问题的答案:
我在我的项目中使用 LocalTime 反序列化器,link 它用于 JSOG/JSON 在调用 API 层时反序列化。我在要反序列化的字段上方的模型层中使用注释声明它。我使用 jackson.databind.JsonDeserializer
,它很适合我`。
这是我使用的代码:
import java.io.IOException;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
public class CustomJacksonLocalTimeDeserializer extends JsonDeserializer<LocalTime> {
@Override
public LocalTime deserialize(JsonParser jsonparser, DeserializationContext context)
throws IOException, JsonProcessingException {
String dateAsString = jsonparser.getText();
try {
return LocalTime.parse(dateAsString, DateTimeFormatter.ISO_LOCAL_TIME);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
您还需要在字段中注释如下:
@JsonDeserialize(using = CustomJacksonLocalTimeDeserializer.class)
@JsonSerialize(using = CustomJacksonLocalTimeSerializer.class)
@Column(columnDefinition = "TIMESTAMP")
private LocalTime origHardScheduledTime;
我知道,你并没有要求它,但为了完成,序列化程序看起来也很相似。
import java.io.IOException;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
public class CustomJacksonLocalTimeSerializer extends JsonSerializer<LocalTime> {
@Override
public void serialize(LocalTime date, JsonGenerator jsonGenerator, SerializerProvider serializers)
throws IOException, JsonProcessingException {
jsonGenerator.writeString(date.format(DateTimeFormatter.ISO_LOCAL_TIME));
}
}