杰克逊归还多个(重复的)田野

时间:2019-10-28 09:18:56

标签: java json serialization jackson jackson2

JAVA POJO:

<div ng-include src="'addPrice.html'"
     ng-controller="addPriceController">

测试代码:

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Getter;
import lombok.Setter;

@Getter @Setter
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Test1 {
    @JsonProperty("aBCFeexxxx")
    private double aBCFee;

}

输出: public static void main(String[] args) throws JsonProcessingException { Test1 t = new Test1(); t.setABCFee(10l); System.out.println((new ObjectMapper()).writeValueAsString(t)); }

为什么在输出中返回{"abcfee":10.0,"aBCFeexxxx":10.0}? 期望是我们只需要返回acbfee

我在做什么错了?

PS:

aBCFeexxxx

1 个答案:

答案 0 :(得分:1)

龙目岛和杰克逊在名为aBCFee的属性的getter和setter方法的命名约定上存在分歧。

我不使用Lombok,所以我让Eclipse为我创建了getter / setter,我得到了:

@JsonInclude(JsonInclude.Include.NON_NULL)
class Test1 {
    @JsonProperty("aBCFeexxxx")
    private double aBCFee;

    public double getaBCFee() {
        return this.aBCFee;
    }
    public void setaBCFee(double aBCFee) {
        this.aBCFee = aBCFee;
    }
}

如您所见,setter方法名为setaBCFee,而不是setABCFee。这段代码可以正常工作。

{"aBCFeexxxx":10.0}

然后我重命名方法以匹配您拥有的方法:

public double getABCFee() {
    return this.aBCFee;
}
public void setABCFee(double aBCFee) {
    this.aBCFee = aBCFee;
}

我得到了你得到的:

{"abcfee":10.0,"aBCFeexxxx":10.0}

如您所见,Jackson将前4个字符小写,而不仅仅是第一个,因此就Jackson而言,getter / setter定义的abcfee属性与{{1} }属性由字段定义,因此您在JSON文本中获得了两个属性。

Java命名约定是将大写首字母缩略词小写,例如“大型HTML文档”应命名为aBCFee作为字段,bigHtmlDoc作为设置器。我建议您重命名字段setBigHtmlDoc

abcFee

Jackson对此感到满意:

@JsonInclude(JsonInclude.Include.NON_NULL)
class Test1 {
    @JsonProperty("aBCFeexxxx")
    private double abcFee;

    public double getAbcFee() {
        return this.abcFee;
    }

    public void setAbcFee(double abcFee) {
        this.abcFee = abcFee;
    }
}

我自己没有Lombok,我认为它会以相同的方式命名getter / setter方法,因此不再存在任何差异。