如何让Jackson无需显式JsonProperty识别构造方法字段名作为属性
解决Jackson无注解反序列化带参数构造方法类的问题
首先修正你代码里的笔误:构造方法名称要和类名一致,改成MyRec,否则编译无法通过,修正后的类代码:
public final class MyRec { final String id; public MyRec(String id) { this.id = id; } }
下面提供两种无需添加@JsonProperty注解的解决方案:
方法一:启用参数名称模块(推荐)
Jackson默认无法直接识别构造方法的参数名——因为Java字节码默认不保留参数名称,需要借助jackson-module-parameter-names模块,同时编译时开启参数名保留。
具体步骤:
- 添加依赖(以Maven为例):
<dependency> <groupId>com.fasterxml.jackson.module</groupId> <artifactId>jackson-module-parameter-names</artifactId> <version>与你使用的Jackson版本保持一致</version> </dependency>
编译时保留参数名:
- Maven项目:在pom.xml的
maven-compiler-plugin中添加配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <compilerArgs> <arg>-parameters</arg> </compilerArgs> </configuration> </plugin>- IDEA开发:打开
Settings -> Build, Execution, Deployment -> Compiler -> Java Compiler,在Additional command line parameters中填入-parameters。
- Maven项目:在pom.xml的
配置ObjectMapper:
注册参数名称模块后,Jackson就能通过构造方法参数名匹配JSON字段:
ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new ParameterNamesModule()); MyRec rec = mapper.readValue("""{"id":"abc"}""", MyRec.class);
方法二:开启Jackson自动检测(Jackson 2.9+可用)
如果不想添加额外模块,也可以通过开启Jackson的自动检测功能实现,前提同样是编译时添加-parameters参数保留参数名:
ObjectMapper mapper = new ObjectMapper(); // 开启自动检测构造器、字段等 mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE); mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); mapper.setVisibility(PropertyAccessor.CREATOR, Visibility.ANY); MyRec rec = mapper.readValue("""{"id":"abc"}""", MyRec.class);
内容的提问来源于stack exchange,提问作者diziaq
相关产品推荐
相关产品推荐

