【问题标题】:@JsonDeserializer in Mixin@JsonDeserializer in Mixin
【发布时间】: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,这行得通。非常感谢!

标签: java json jackson


【解决方案1】:

这里的错误是自定义反序列化器未声明为静态。所以如果我按照下面提到的方式使用它,它就可以工作。

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)));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 2011-10-29
    相关资源
    最近更新 更多