【发布时间】:2018-02-08 22:09:34
【问题描述】:
考虑以下示例:
我有一个 json 字符串 = {"timestamp":1504111920} 需要转换为 CodeTimestamp 类。上面 json 字符串中的时间戳是纪元秒。
CodeTimestamp 类:
@Getter
@Setter
@NoArgsConstructor
class CodeTimestamp {
private Date timestamp;
}
通过直接使用fastxml jackson mapper,我将无法获得正确的日期,因为它假定时间戳以纪元毫秒为单位。所以,我需要编写一个自定义反序列化器。
但是,我无法编辑/修改 CodeTimestamp 类。有没有办法在mixin中写JsonDeserializer?
我在反序列化时遇到问题。以下是代码:
public abstract class StreamRecordMixIn {
@JsonDeserialize(using = UnixTimestampDeserializer.class)
private Date approximateCreationDateTime;
}
public class UnixTimestampDeserializer extends JsonDeserializer<Date> {
@Override
public Date deserialize(JsonParser parser, DeserializationContext context)
throws IOException, JsonProcessingException {
String unixTimestamp = parser.getText().trim();
return new Date(TimeUnit.SECONDS.toMillis(Long.valueOf(unixTimestamp)));
}
}
初始化和使用对象映射器的代码:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.addMixIn(CodeTimestamp.class, StreamRecordMixIn.class);
CodeTimestamp codeTimeStamp = objectMapper.readValue(payload, CodeTimestamp.class);
错误:
原因:java.lang.IllegalArgumentException:类 com.test.TestConverter$UnixTimestampDeserializer 没有默认(无 arg)构造函数 在 com.fasterxml.jackson.databind.util.ClassUtil.createInstance(ClassUtil.java:378) 在 com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.deserializerInstance(DefaultDeserializationContext.java:218) 在 com.fasterxml.jackson.databind.deser.BasicDeserializerFactory.findDeserializerFromAnnotation(BasicDeserializerFactory.java:1735) 在 com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.constructSettableProperty(BeanDeserializerFactory.java:730) 在 com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.addBeanProps(BeanDeserializerFactory.java:507) 在 com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.buildBeanDeserializer(BeanDeserializerFactory.java:229) 在 com.fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:142) 在 com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:403) 在 com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:352) 在 com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264) ... 23 更多
【问题讨论】:
-
有没有办法在mixin中写JsonDeserializer?当然,有什么问题?
-
@nullpointer 提供的解决方案在实际类上使用注释。不确定在mixin中是否可以做到这一点。为了更清楚,我更新了问题。
-
当然,这基本上就是 mixins 的意义所在。你的问题是
UnixTimestampDeserializer不是静态的。 -
感谢@shmosel,这行得通。非常感谢!