无法按照Javadoc中所述使用@JsonCreator正确反序列化JSON

问题描述 投票:0回答:1

我很难理解Jackson的@JsonCreator注释的工作原理(尤其是在不同的模式下。)>

我最多尝试简化:

public class JacksonDeserialization {

    private ObjectMapper om = new ObjectMapper();

    @Test // 1
    public void test_deserialization_emptyJson() throws JsonParseException, JsonMappingException, IOException {
        Wrapper read = om.readValue("{}", Wrapper.class);
        // Throws here: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `Inner` (although at least one Creator exists): cannot deserialize from Object value (no delegate- or property-based Creator)

        assertThat(read).isNotNull();
        assertThat(read.getInner()).isNull();
    }

    @Test // 2
    public void test_deserialization_innerIsEmpty() throws JsonParseException, JsonMappingException, IOException {
        Wrapper read = om.readValue("{\"inner\":{}}", Wrapper.class);
        // Throws here: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "inner" (class Inner), not marked as ignorable (one known property: "prop"])

        assertThat(read).isNotNull();
        assertThat(read.getInner()).isNotNull();
    }

    @Test // 3
    public void test_deserialization_innerIsSet() throws JsonParseException, JsonMappingException, IOException {
        Wrapper read = om.readValue("{\"inner\":{\"prop\":\"42\"}}", Wrapper.class);
        // Throws here: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "inner" (class Inner), not marked as ignorable (one known property: "prop"])

        assertThat(read).isNotNull();
        assertThat(read.getInner()).isNotNull();
        assertThat(read.getInner().getProp()).isEqualTo("42");
    }

}

我的对象类:

public class Wrapper {

    private Inner inner;

    @JsonCreator
    public Wrapper(Inner inner) {
        this.inner = inner;
    }

    public Inner getInner() {
        return inner;
    }

}

public class Inner {

    private String prop;

    @JsonCreator
    public Inner(String prop) {
        this.prop = prop;
    }

    public String getProp() {
        return prop;
    }

}

摘录,摘自@JsonCreator Javadoc:

注意:注释创建者方法(构造函数,工厂方法)时,方法必须是:

•不带参数的JsonPropertyannotation的单参数构造函数/工厂方法:如果是这样,则这就是所谓的“委托创建者”,在这种情况下,Jackson首先将JSON绑定到参数的类型,然后调用creator。这通常与JsonValue(用于序列化)结合使用。

...及其mode自变量:

Mode.DEFAULT的默认值表示调用方将使用标准启发式方法选择要使用的模式。

[com.fasterxml.jackson.annotation.JsonCreator.Mode.DEFAULT Javadoc:

伪模式,指示呼叫者将使用默认试探法来选择要使用的模式。对于采用结构化类型的单参数创建者,这通常倾向于使用委托模式。

我对这些解释有什么错?

我使用杰克逊2.9.9.20190807,如我们所使用的Spring Boot中的一个pom.xml所示。

我很难理解Jackson的@JsonCreator注释的工作原理(尤其是在不同的模式下)。我最多尝试简化:公共类JacksonDeserialization {private ...

java json jackson json-deserialization
1个回答
0
投票

我承认我不了解JsonCreator模式。但是,如果用属性名称注释构造函数参数,则测试将通过。

© www.soinside.com 2019 - 2024. All rights reserved.