56

我继承了某个位代码,该代码在 getter/setter 上有 @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 上都使用过相同的注释?我在网上四处张望,但什么也没看到。

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

4

2 回答 2

54

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

例如。考虑对您的情况稍作修改:

@JsonProperty("fileName")
private String fileName;

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

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

fileNamefield 和 method都getFileName具有正确的属性名称fileNamesetFileName不同的属性名称fileName1,在这种情况下,Jackson 将在反序列化fileName1时在 json 中查找属性,并在序列化时创建一个名为的属性fileName1

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

java.lang.IllegalStateException: Conflicting property name definitions
于 2012-07-17T18:45:37.297 回答
11

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

在 Jackson 1.8 和之前的版本中,在确定序列化的内容和方式(编写 JSON)时,只使用了字段和 getter 注释;并且只有和 setter 注释用于反序列化(读取 JSON)。这有时需要添加“额外”注释,例如同时注释 getter 和 setter。

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

于 2012-07-18T19:02:25.987 回答