我很难理解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 ...
我承认我不了解JsonCreator模式。但是,如果用属性名称注释构造函数参数,则测试将通过。