JSON 响应中的重复字段

Posted

技术标签:

【中文标题】JSON 响应中的重复字段【英文标题】:Duplicate fields in JSON Response 【发布时间】:2018-12-21 04:08:13 【问题描述】:

我在我的项目中使用 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

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

【问题讨论】:

不,在 java 中,变量名使用小写形式。 【参考方案1】:

当您使用不使用下划线的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

【讨论】:

【参考方案2】:

这是你的班级在 delomboking 后的样子:

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() + ")";
    

如果未指定生成的属性名称,Jackson 通过从 getter 中剥离前缀 isget 来生成它,如果使用 getter,或者如果序列化字段而不使用 getter,则使用 Java 字段名称。默认情况下,Jackson 仅在序列化期间使用 getter。因为您将@JsonProperty 放在字段上,所以杰克逊同时使用字段和getter,并通过匹配生成的属性名称检查该字段是否已经序列化(这最后一部分是我的猜测)它无法识别从字段is_primaryTcin 生成的属性和从 getter is_primaryTcin() 生成的属性相同(一个在内部命名为 is_primaryTcin,另一个在内部命名为 _primaryTcin) - 请注意,如果将 is_primaryTcin 重命名为 as_primaryTcin,问题就会消失。

【讨论】:

以上是关于JSON 响应中的重复字段的主要内容,如果未能解决你的问题,请参考以下文章

用于从 JSON 解析特定字段的 Javascript 方法 [重复]

如何在 JSON 对象中传递变量 [重复]

从 Tone Analyser 的 JSON 响应中的字典列表中提取数据 [重复]

我的 JSON 数据是不是应该包含嵌套字段而不是重复信息?

AngularJS 表单。 JSON中的可选属性[重复]

在 JSON 响应中处理 NULL 值:Python Flask [重复]