2017-08-31 37 views
0

考慮下面的例子:@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多個

+0

的[我如何反序列化是在與傑克遜秒時間戳?(可能的複製https://stackoverflow.com/questions/20635698/how-do-i-deserialize-timestamps-that-are- in-seconds-with-jackson) – nullpointer

+0

*有什麼方法可以在mixin中編寫JsonDeserializer?*當然,問題是什麼? – shmosel

+0

@nullpointer提供的解決方案使用對實際類的註釋。不確定在mixin中可以做到這一點。我已經更新了這個問題以獲得更多的清晰。 –

回答

0

這裏的錯誤是未聲明爲靜態的自定義反序列化器。所以如果我使用它,如下所述,它的工作原理。

public static 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))); 
    } 
} 
相關問題