【问题标题】:How to remove duplicate @JsonProperty in Jackson如何在杰克逊中删除重复的@JsonProperty
【发布时间】:2020-01-26 15:48:18
【问题描述】:

我有一个非常简单的 JSON 类与杰克逊:

public class Hoge {
    @JsonProperty("id")
    public final int cid;

    public Hoge(@JsonProperty("id") aid){
        cid = aid;
    }
}

我注意到我必须将 @JsonProperty("id") 放在两个地方才能相互转换 JSON 字符串 JSON 对象, 第一个是字段声明,第二个是构造函数的参数。

当我删除第一个 @JsonProperty 时,JSON 键变为“cid”,而不是“id”。但我希望键名是“id”。

当我删除第二个时,我有一个例外:

没有找到适合类型[简单类型,类系列]的构造函数:无法从 JSON 对象实例化(需要添加/启用类型信息?)

我想保留字段名称(代码中的“cid”)和 JSON 键(代码中的“id”)不同。

当我删除构造函数时,我遇到了编译错误,因为 id 必须是“最终的”才能保持不可变。

有谁知道如何删除示例中重复的@JsonProperty?

【问题讨论】:

  • 如果要映射名称(代码中的cid,json中的id),则需要两个注解。你真的需要构造函数有参数吗?如果没有,只需将其删除。
  • 当我删除构造函数时,我有一个编译错误,因为 id 是“final”...
  • 然后去掉final修饰符。或者你需要它吗?两次注释有什么问题?
  • 我想保留决赛。我只是想让代码尽可能干净。
  • 为什么你认为final 可以让你的代码更干净?

标签: java json jackson


【解决方案1】:

如果你真的想在字段中保留final修饰符并从构造函数中删除@JsonProperty注释,你可以用@JsonCreator注释构造函数并将参数从aid重命名为id,如下图:

@Data
public class Hoge {

    @JsonProperty("id")
    public final int cid;

    @JsonCreator
    public Hoge(int id){
        this.cid = id;
    }
}

然后使用以下方法之一:

ParanamerModule

在您的ObjectMappper 中注册ParanamerModule

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

您需要对类路径的以下依赖项:

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-paranamer</artifactId>
    <version>${jackson.version}</version>
</dependency>

详情请参阅documentation

ParameterNamesModule

注册ParameterNamesModule 模块并确保使用-parameters 选项编译代码:

ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new ParameterNamesModule(JsonCreator.Mode.PROPERTIES));

需要以下依赖:

<dependency>
    <groupId>com.fasterxml.jackson.module</groupId>
    <artifactId>jackson-module-parameter-names</artifactId>
    <version>${jackson.version}</version>
</dependency>

详情请参阅documentation

【讨论】:

    猜你喜欢
    • 2017-05-03
    • 2013-06-15
    • 2017-02-15
    • 2019-01-08
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    相关资源
    最近更新 更多