【问题标题】:default Jackson naming strategy for fields with short names具有短名称的字段的默认 Jackson 命名策略
【发布时间】:2022-01-03 02:46:28
【问题描述】:

我已经使用 Jackson 多年,但我不确定我是否遇到过这个问题。

在 Spring Boot 2.5.5 项目中使用 Jackson 2.12.5,我有一个需要序列化的对象。我对其他字段没有问题,但这两个字段给我带来了问题:

@Jacksonized
@Builder
@Getter
public class ComputationResult {
  
  private final String pId;

  private final String cId;

  ... other fields ignored

} 

如您所见,我也在使用 Lombok 注释。当“delombokized”时,吸气剂是:

  public String getPId() {
    return this.pId;
  }

  public String getCId() {
    return this.cId;
  }

在序列化 POJO 时,我希望字段名称是“pId”和“cId”,但它们不是:我得到的“pid”和“cid”都是小写的。我在其他领域没有问题,对此情况予以尊重。

这给我带来了一个问题,因为我需要对 POJO 进行序列化然后反序列化,而反序列化失败是因为它无法将“cid”json 字段映射到“cId”java 字段。

有各种解决方法(我在现场使用@JsonAlias("cid") 来允许反序列化),但我很困惑:这是杰克逊的预期行为吗?它是否根据字符串的长度以不同的方式处理字符串字段?还是我不知道的 java bean 约定?

是否有要在 objectMapper 中设置的属性来“修复”行为,而不实现我自己的 com.fasterxml.jackson.databind.PropertyNamingStrategy

【问题讨论】:

    标签: java spring-boot jackson jackson-databind


    【解决方案1】:

    这个问题似乎是由在属性名称的开头有一个小写字符时如何生成 JavaBeans 方法引起的。 getpId and getcId are indeed correctly named 和我一样,您可能会感到惊讶。

    简而言之,pId 正确地导致 getter getpId 而不是 Lombok 生成的 getPId(我认为 JavaBeans 应该保留的那个)。

    现在,有趣的是,Jackson 出于某种原因分别从getCIdgetPId 中生成了cidpid……同时生成了cIdpId对于getcIdgetpId

    因此,虽然 getcIdgetpId 是 JavaBeans 的一个怪癖,但当 getter 被正确命名时,Jackson 的默认行为似乎是正确的,即 getpId -> "pId"getcId -> "cId"
    鉴于 Lombok 生成 getPIdgetCId,这会导致生成的 JSON 中的键全为小写,因此反序列化不起作用。

    如果您不喜欢 getpId/getcId 命名,那么您可能必须编写自己的 getter 并显式强制使用属性名称:

    @Builder
    @Jacksonized
    class ComputationResult {
    
        private final String pId;
        private final String cId;
    
        @JsonProperty("pId")
        public String getPId() {
            return pId;
        }
    
        @JsonProperty("cId")
        public String getCId() {
            return cId;
        }
    }
    

    对于二传手,您已经不得不依赖@Jacksonized,因为无论如何都有final 字段,所以这没什么区别。请注意 @Getter 必须省略,因为它会导致重复的属性(即使用另一种命名方式)。

    【讨论】:

      猜你喜欢
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 2020-06-06
      • 1970-01-01
      相关资源
      最近更新 更多