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

Oce*_*lue 50 java serialization json 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;
}
Run Code Online (Sandbox Code Playgroud)

现在换另一个工具,我需要用JsonProperty来注释该字段.所以这将是我改变的代码:

@JsonProperty("FILENAME")
private String fileName;

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

@JsonProperty("FILENAME")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}
Run Code Online (Sandbox Code Playgroud)

有没有人在这两个领域使用相同的注释 - 领域以及吸气剂/安装者?我环顾四周,但没有看到任何东西.

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

Bij*_*men 45

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

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

@JsonProperty("fileName")
private String fileName;

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

@JsonProperty("fileName1")
public void setFileName(String fileName)
{
    this.fileName = fileName;
}
Run Code Online (Sandbox Code Playgroud)

这两个fileName字段,方法getFileName,有正确的属性名称fileName,并setFileName具有不同的一个fileName1,在这种情况下,杰克逊将寻找一个fileName1在反序列化的点JSON属性,会创建一个名为属性fileName1的序列化的地步.

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

java.lang.IllegalStateException: Conflicting property name definitions
Run Code Online (Sandbox Code Playgroud)

  • 实际上getter用fileName注释并将用于序列化(从对象实例到字符串),而用fileName1注释的setter将用于反序列化(从字符串到对象实例) (4认同)
  • 不,你错了.fileName将用于反序列化,fileName1将用于序列化(版本2.8.5) (3认同)

Sta*_*Man 9

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

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

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