You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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模块,同时编译时开启参数名保留。

具体步骤:

  1. 添加依赖(以Maven为例):
<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
    <version>与你使用的Jackson版本保持一致</version>
</dependency>
  1. 编译时保留参数名:

    • 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。
  2. 配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:41:29