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

时间:2012-07-17 16:29:38

标签: java json serialization jackson

我继承了一些在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?我在网上环顾四周,但没有看到任何东西。

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

2 个答案:

答案 0 :(得分:44)

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

例如。考虑稍微修改一下你的案子:

@JsonProperty("fileName")
private String fileName;

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

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

fileName字段和方法getFileName都具有正确的属性名称fileName,而setFileName具有不同的fileName1,在这种情况下,杰克逊将在反序列化时在json中查找fileName1属性,并在序列化时创建一个名为fileName1的属性。

现在,来到你的情况,所有三个@JsonProperty都与fileName的默认属性名不同,它只选择其中一个作为属性(FILENAME),并且有任何关于如果三者不同,那就会抛出异常:

java.lang.IllegalStateException: Conflicting property name definitions

答案 1 :(得分:9)

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

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

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