Java @字段和getter/setter上的JsonProperty注释

Java @字段和getter/setter上的JsonProperty注释,java,json,serialization,jackson,Java,Json,Serialization,Jackson,我继承了在getter/setter上具有@JsonProperty注释的特定位代码。这样做的目的是,当使用Jackson库序列化对象时,字段具有该特定名称 当前代码: private String fileName; @JsonProperty("FILENAME") public String getFileName() { return fileName; } @JsonProperty("FILENAME") public void setFileName(String fi

我继承了在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上都使用了相同的注释?我在网上四处张望,但什么也没看到


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

根据一些测试,我的观察结果是,任何与属性名称不同的名称都会生效:

考虑一下对你的情况的轻微修改:

@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
,在这种情况下,Jackson将在反序列化点查找json中的
fileName1
属性,并在序列化点创建名为
fileName1
的属性

现在,在您的案例中,如果所有三个@JsonProperty都不同于
fileName
的默认propertyname,它只会选择其中一个作为属性(
fileName
),如果这三个属性中的任何一个不同,它将抛出一个异常:

java.lang.IllegalStateException: Conflicting property name definitions

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

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


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

实际上,您不会有问题,因为除了设置值之外,您在setter中没有做任何事情。然而,如果这种情况发生改变,我会担心杰克逊会用哪一个;如果它选择了字段,您可能无法获得预期的行为。不幸的是,我找不到你的优先顺序。是的,优先顺序是有用的,但当然它们不应该有不同的名称。所以在不同名称的情况下不会出现“名称冲突”错误?不会,因为这是合法用法。但是,如果多个setter/getter方法之间存在冲突,并且不清楚要使用哪个方法,则会有例外。不,您错了。fileName将用于反序列化,fileName1将用于序列化(版本2.8.5)。实际上,getter用fileName注释,并将用于序列化(从对象实例到字符串),而setter用fileName1注释,将用于反序列化(从字符串到对象实例)在field和getter上使用jsonproperty的原因是什么?若你们们同时拥有盖特和塞特,为什么你们们会在球场上需要它呢?