消除重复的Json元素并检索以大写字母开头的元素名称spring boot / java

Jun*_*3ta 5 json type-conversion pojo jackson spring-boot

我正在使用Spring Boot和Spring Framework(spring-boot-starter-parent 2.1.6.RELEASE)开发Rest Client,我有一个表示响应对象的类,如下所示:

public class ValidateResponse {
    private String ResponseCode;
    private String ResponseDesc;

    //getters and setters
    //constructors using fields
    //empty constructor
}
Run Code Online (Sandbox Code Playgroud)

我正在为外部api创建网络挂钩,并且需要为特定端点返回JSON对象(JSON对象属性必须以大写字母开头)。我正在调用从PostMapping嵌套在RequestMapping根路径中的方法返回对象:

@PostMapping("hooks/validate")
public ValidateResponse responseObj(@RequestHeader Map<String, String> headersObj) {
    ValidateResponse response = new ValidateResponse("000000", "Success");

    logger.info("Endpoint = hooks/validate | Request Headers = {}", headersObj);

    return response;

} 
Run Code Online (Sandbox Code Playgroud)

但是,当我从邮递员到达终点时,我得到了重复的varialbes

{
    "ResponseCode": "000000",
    "ResponseDesc": "Success",
    "responseCode": "000000",
    "responseDesc": "Success"
}
Run Code Online (Sandbox Code Playgroud)

我知道pojo-json转换是由spring处理的,但是我不明白为什么转换会产生重复的变量。

注意:我知道使用最佳命名变量标准(camelCasing)不会声明ResponseDescResponseCode

我已经按照Java语言规范进行了一些挖掘

标识符是Java字母和Java数字的无限长度序列,其中第一个必须是Java字母。

“ Java字母”包括大写和小写的ASCII拉丁字母AZ(\ u0041- \ u005a)和az(\ u0061- \ u007a),并且由于历史原因,ASCII下划线(_或\ u005f)和美元符号($或\ u0024)。$字符仅应在机械生成的源代码中使用,或很少用于访问旧系统上的现有名称。

因此,我假设它在语法上正确地使用Camelcase[需要对此澄清]格式定义变量。

我正在考虑必须手动创建JSON对象,但我想首先了解此行为的原因。任何指针表示赞赏。

Ser*_*hak 1

public class ValidateResponse {

    @JsonProperty("ResponseDesc")
    public String responseCode;

    @JsonProperty("ResponseDesc")
    public String responseDesc;

    //getters and setters
    //constructors using fields
    //empty constructor
}
Run Code Online (Sandbox Code Playgroud)

这必须解决您的问题,但我不知道原因,因为它需要深入杰克逊调查。

编辑

我找到了原因。该字段被重复,因为在您的情况下您有:

  • 2 个以大写字母命名的公共字段 -> 它们将由 Jackson 处理
  • 2 个 gettergetResponseCodegetResponseDesc-> 它们将被解析为属性的访问器responseCoderesponseDesc相应地。

总结一下 - Jackson 解决了您的 4 个属性。只需将您的字段设为私有即可解决您的问题,但我仍然建议使用JsonProperty方法。