首页 > 解决方案 > 无法反序列化 json:MismatchedInputException。使用静态类

问题描述

我正在使用帮助内部类来反序列化一些输入。当我使用静态类时,反序列化有效。

    public class Test {

    public static void main(String[] args) throws IOException {
        String message = "{\"location\":\"https://some.com\"}";
        URL url = new ObjectMapper()
                .readValue(message, Loc.class).getLocation();
        System.out.println(url.toString());
    }

        @Getter
        @Setter
        private class Loc {
            URL location;
        }

}

在上面运行主类时出现错误:

    Exception in thread "main" com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `Test$H$Loc` (although at least one Creator exists): can only instantiate non-static inner class by using default, no-argument constructor
 at [Source: (String)"{"location":"https://some.com"}"; line: 1, column: 2]
    at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
    at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343)
    at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1032)
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1294)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:326)
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:159)
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3004)

当我将类设为静态时,一切正常。但我需要非静态类。怎么了?

UPD:我可以通过将 Loc 类设为外部而不是内部类来解决这个问题。我的问题是,当我想将 Loc 作为内部类时,为什么我应该将其设为静态以进行序列化?UPD:删除了无关紧要的内部类 H

标签: javajacksondeserializationinner-classes

解决方案


为什么需要这么奇怪的结构?但是无所谓。如果你想要这样的结构,你需要让你的H班级static以及Loc

公共类测试{

public static void main(String[] args) throws IOException {
    String message = "{\"location\":\"https://some.com\"}";
    URL url = new ObjectMapper()
            .readValue(message, H.Loc.class).getLocation();
    System.out.println(url.toString());
}

private static class H {
    @Getter
    @Setter
    @NoArgsConstructor
    private static class Loc {
        URL location;
    }
}

}


推荐阅读