JSON响应中的字段重复

时间:2018-07-12 20:25:13

标签: java spring-boot jackson lombok

我在我的项目中使用Spring boot Jackson依赖项和lombok,并且由于下划线,我得到重复的字段

这是我的模型课:

 @Getter
 @Setter
 @Accessors(chain = true)
 @NoArgsConstructor
 @ToString
 public class TcinDpciMapDTO {

 @JsonProperty(value = "tcin")
 private String tcin;
 @JsonProperty(value = "dpci")
 private String dpci;

 @JsonProperty(value = "is_primary_tcin_in_dpci_relation")
 private boolean is_primaryTcin = true;

 }

如果我在is_primaryTcin字段中使用下划线,那么我将获得以下重复字段的响应

 {
    "_primaryTcin": true,
    "tcin": "12345",
    "dpci": "12345",
    "is_primary_tcin_in_dpci_relation": true
 }

如果我从字段isprimaryTcin中删除下划线,那么我将获得正确的答复

{
    "tcin": "12345",
    "dpci": "12345",
    "is_primary_tcin_in_dpci_relation": true
}

这是因为有下划线吗?但是下划线更喜欢在变量名中使用对吗?

2 个答案:

答案 0 :(得分:4)

这是您的班级拆解后的样子:

public class TcinDpciMapDTO {
    @JsonProperty("tcin")
    private String tcin;
    @JsonProperty("dpci")
    private String dpci;
    @JsonProperty("is_primary_tcin_in_dpci_relation")
    private boolean is_primaryTcin = true;

    public String getTcin() {
        return this.tcin;
    }

    public String getDpci() {
        return this.dpci;
    }

    public boolean is_primaryTcin() {
        return this.is_primaryTcin;
    }

    public TcinDpciMapDTO setTcin(String tcin) {
        this.tcin = tcin;
        return this;
    }

    public TcinDpciMapDTO setDpci(String dpci) {
        this.dpci = dpci;
        return this;
    }

    public TcinDpciMapDTO set_primaryTcin(boolean is_primaryTcin) {
        this.is_primaryTcin = is_primaryTcin;
        return this;
    }

    public TcinDpciMapDTO() {
    }

    public String toString() {
        return "TcinDpciMapDTO(tcin=" + this.getTcin() + ", dpci=" + this.getDpci() + ", is_primaryTcin=" + this.is_primaryTcin() + ")";
    }
}

如果未指定生成的属性名,则杰克逊通过使用getter去除getter中的前缀isget来生成它,如果不使用getter来序列化字段,则使用Java字段名来生成它。默认情况下,Jackson仅在序列化过程中使用吸气剂。因为您将@JsonProperty放在了字段上,所以Jackson会同时使用字段和getter并检查字段是否已经通过匹配生成的属性名进行序列化(无论如何,这都是我的猜测),它无法识别从字段{{ 1}}和从getter is_primaryTcin生成的属性相同(一个内部命名为is_primaryTcin(),另一个is_primaryTcin)-请注意,如果将_primaryTcin重命名为{{1 }}问题消失了。

答案 1 :(得分:2)

当您使用is_primaryTcin而不使用下划线时,则同时使用了两者。 您可以使用PropertyNamingStrategy对其进行修复。

如果愿意

...
@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public class TcinDpciMapDTO {
    private String tcin;
    private String dpci;
    private boolean isPrimaryTcinInDpciRelation = true;
}

JSON输出为

{
    "tcin": "12345",
    "dpci": "12345",
    "is_primary_tcin_in_dpci_relation": true
}