Jackson module that adds support for accessing parameter names; a feature added in JDK 8.
NOTE: only available for Jackson 2.x; functionality included in jackson-databind
itself
for Jackson 3.x.
For maven dependency definition, click on the second badge in the previous, Status section.
Like all standard Jackson modules (libraries that implement Module interface), registration is done as follows:
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new ParameterNamesModule());
after which functionality is available for all normal Jackson operations.
By default, Jackson uses single argument constructors for mapping whole JSON value into value of the argument.
To override this behavior use the ParameterNamesModule
constructor with JsonCreator.Mode
parameter.
For example, to use same behavior as for constructors with multiple parameters:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));
Java 8 API adds support for accessing parameter names at runtime in order to enable clients to abandon the JavaBeans standard if they want to without forcing them to use annotations (such as JsonProperty).
So, after registering the module as described above, you will be able to use data binding with a class like
class Person {
// mandatory fields
private final String name;
private final String surname;
// optional fields
private String nickname;
// no annotations are required if preconditions are met (details below)
public Person(String name, String surname) {
this.name = name;
this.surname = surname;
}
public String getName() {
return name;
}
public String getSurname() {
return surname;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
}
Preconditions:
- class Person must be compiled with Java 8 compliant compiler with option to store formal parameter names turned on (
-parameters
option). For more information about Java 8 API for accessing parameter names at runtime see this - if there are multiple visible constructors and there is no default constructor,
@JsonCreator
is required to select constructor for deserialization - if used with
jackson-databind
lower than2.6.0
,@JsonCreator
is required. In practice,@JsonCreator
is also often required with2.6.0+
due to issues with constructor discovery that will be resolved in2.7
. - if class Person has a single argument constructor, its argument needs to be annotated with
@JsonProperty("propertyName")
. This is to preserve legacy behavior, see FasterXML/jackson-databind/#1498
See Wiki for more information (javadocs, downloads).