为什么当一个构造函数用@JsonCreator注解时,它的参数必须用@JsonProperty注解?

在Jackson中,当你用@JsonCreator注解一个构造函数时,你必须用@JsonProperty注释它的参数。 所以这个构造函数

 public Point(double x, double y) { this.x = x; this.y = y; } 

变成这样:

 @JsonCreator public Point(@JsonProperty("x") double x, @JsonProperty("y") double y) { this.x = x; this.y = y; } 

我不明白为什么这是必要的。 你能解释一下吗?

jackson必须知道以什么顺序将字段从JSON对象传递给构造函数。 无法使用reflection访问Java中的参数名称 – 这就是为什么您必须在注释中重复此信息的原因。

Java代码在运行时通常不能访问参数名称(因为它被编译器拖放),所以如果需要该function,您需要使用Java 8的内置function或使用诸如ParaNamer之类的库来访问到它。

所以为了在使用Jackson时不必为构造函数参数使用注释,可以使用这两个Jackson模块中的任何一个:

jackson模块参数名称

使用Java 8时,此模块允许您获取无注释的构造函数参数。 为了使用它,你首先需要注册模块:

 ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new ParameterNamesModule()); 

然后使用-parameters标志编译你的代码:

 javac -parameters ... 

链接: https : //github.com/FasterXML/jackson-module-parameter-names

jackson模块-paranamer

这另外一个只需要你注册模块或configuration一个注释自省(但不是两个注释指出)。 它允许您在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-module-paranamer

可以避免使用jdk8构造函数注释,其中编译器可以使用构造函数参数的名称引入元数据。 然后用jackson-module-parameter-names模块Jackson可以使用这个构造函数。 你可以在jackson后看到一个没有注释的例子

  • Java™教程 – 获取方法参数的名称

由于Java字节码不保留方法或构造函数参数的名称。

如注释文档中所述,注释表示参数名称被用作属性名称而没有任何修改,但是可以指定非空值来指定不同的名称:

当我正确理解这个 ,你用一个参数化的默认构造函数replace,因此必须描述用来调用构造函数的JSON键。