@JsonProperty字段以及 getter/setter 上的注释

2022-08-31 17:38:35

我继承了某个位代码,该代码在 getter/setters 上具有@JsonProperty注释。其目的是,当使用 Jackson 库序列化对象时,字段具有该特定名称。

当前代码:

private String fileName;

@JsonProperty("FILENAME")
public String getFileName()
{
    return fileName;
}

@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}

现在,对于另一个工具,我还需要使用JsonProperty注释字段。所以这将是我更改的代码:

@JsonProperty("FILENAME")
private String fileName;

@JsonProperty("FILENAME")
public String getFileName()
{
    return fileName;
}

@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}

有没有人在字段和 getter/setter 上都使用过相同的注释?我在网上环顾四周,但什么也没看到。

我已经编译并运行了代码,但我不确定这是否会导致任何问题。对此有什么想法吗?


答案 1

我基于一些测试的观察结果是,无论哪个名称与属性名称不同,都会生效:

例如。考虑对您的情况进行轻微的修改:

@JsonProperty("fileName")
private String fileName;

@JsonProperty("fileName")
public String getFileName()
{
    return fileName;
}

@JsonProperty("fileName1")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}

字段和方法都有正确的属性名称,并且具有不同的属性名称,在这种情况下,Jackson 将在反序列化点以 json 格式查找属性,并将创建一个在序列化点调用的属性。fileNamegetFileNamefileNamesetFileNamefileName1fileName1fileName1

现在,来到您的情况,其中所有三个@JsonProperty都与 的默认属性名不同,它只会选择其中一个作为属性(),并且三个属性中的任何一个都不同,它将引发一个异常:fileNameFILENAME

java.lang.IllegalStateException: Conflicting property name definitions

答案 2

除了现有的好答案之外,请注意,Jackson 1.9 通过添加“属性统一”改进了处理,这意味着来自逻辑属性不同部分的所有注释都使用(希望)直观的优先级进行组合。

在Jackson 1.8及更早版本中,在确定序列化的内容和方式(编写JSON)时仅使用字段和getter注释;以及用于反序列化(读取 JSON)的仅和 setter 注释。这有时需要添加“额外”注释,例如同时对 getter 和 setter 进行注释。

对于Jackson 1.9及更高版本,不需要这些额外的注释。仍然可以添加这些;如果使用不同的名称,则可以创建“拆分”属性(使用一个名称进行序列化,使用其他名称进行反序列化):这对于某种重命名偶尔很有用。