Answers:
Jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。使用反射无法在Java中访问参数名称-这就是为什么您必须在批注中重复此信息的原因。
Java代码通常在运行时无法访问参数名称(因为它会被编译器删除),因此,如果要使用该功能,则需要使用Java 8的内置功能或使用诸如ParaNamer之类的库才能获得访问权限对它。
因此,为了在使用Jackson时不必在构造函数参数中使用批注,可以使用以下2个Jackson模块之一:
使用Java 8时,此模块允许您获取无注释的构造函数参数。为了使用它,您首先需要注册模块:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new ParameterNamesModule());
然后使用-parameters标志编译代码:
javac -parameters ...
链接:https://github.com/FasterXML/jackson-modules-java8/tree/master/parameter-names
这另一项仅需要您注册模块或配置注释自检(但不能同时如注释所指出的那样)。它允许您在1.8之前的Java版本上使用无注释的构造函数参数。
ObjectMapper mapper = new ObjectMapper();
// either via module
mapper.registerModule(new ParanamerModule());
// or by directly assigning annotation introspector (but not both!)
mapper.setAnnotationIntrospector(new ParanamerOnJacksonAnnotationIntrospector());
链接:https://github.com/FasterXML/jackson-modules-base/tree/master/paranamer
可以通过jdk8避免使用构造函数注释,在这种情况下,编译器可以选择使用构造函数参数名称引入元数据。然后,通过jackson-module-parameter-names模块,Jackson可以使用此构造函数。您可以在Jackson帖子上看到一个没有注释的示例
因为Java字节码不保留方法或构造函数参数的名称。
@JsonProperty
注释
可以简单地使用java.bean.ConstructorProperties批注-不再那么冗长,Jackson也接受它。例如 :
import java.beans.ConstructorProperties;
@ConstructorProperties({"answer","closed","language","interface","operation"})
public DialogueOutput(String answer, boolean closed, String language, String anInterface, String operation) {
this.answer = answer;
this.closed = closed;
this.language = language;
this.anInterface = anInterface;
this.operation = operation;
}