考慮下面的例子:@JsonDeserializer在密新
我有一個JSON字符串= {"timestamp":1504111920}
需要被轉換爲CodeTimestamp類。上面的json字符串中存在的時間戳記在第二個紀元中。
CodeTimestamp類:
@Getter
@Setter
@NoArgsConstructor
class CodeTimestamp {
private Date timestamp;
}
通過直接使用fasterxml傑克遜映射器,我就無法得到,因爲它假定時間戳是在時代毫秒正確的日期。所以,我需要編寫一個自定義的反序列化器。
但是,我無法編輯/修改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)構造函數 at com.fasterxml.jackson.databind.util.ClassUtil.createInstance(ClassUtil.java:378) at com.fasterxml.jackson.databind.deser.DefaultDeserializationContext.deserializerI nstance(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) 在融爲一體。 fasterxml.jackson.databind.deser.BeanDeserializerFactory.createBeanDeserializer(BeanDeserializerFactory.java:142) at com.fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer2(DeserializerCache.java:403) at com .fasterxml.jackson.databind.deser.DeserializerCache._createDeserializer(DeserializerCache.java:352) 在com.fasterxml.jackson.databind.deser.DeserializerCache._createAndCache2(DeserializerCache.java:264) ...... 23多個
的[我如何反序列化是在與傑克遜秒時間戳?(可能的複製https://stackoverflow.com/questions/20635698/how-do-i-deserialize-timestamps-that-are- in-seconds-with-jackson) – nullpointer
*有什麼方法可以在mixin中編寫JsonDeserializer?*當然,問題是什麼? – shmosel
@nullpointer提供的解決方案使用對實際類的註釋。不確定在mixin中可以做到這一點。我已經更新了這個問題以獲得更多的清晰。 –