如何避免使用不可变对象和不匹配的属性名重复@JsonProperty注释?

时间:2017-12-15 13:08:39

标签: java jackson

我处理的json在属性名称中使用了下划线,但我希望在Java中保留camel case。此外,我使用不可变风格的POJO,因为这是我们团队长期采用的最佳实践。

如果我在构造函数和getter中添加了重复的@JsonProperty注释,一切正常,但这会增加很多不必要的膨胀(在我们的类中,我们有几十个属性。)有没有办法告诉Jackson一旦如何将Java属性名称转换为JSON属性名称?

 public class Foo {

     public final String someProperty;

     @JsonCreator
     public Foo(@JsonProperty("some_property") someProperty) {
         this.someProperty = someProperty;
     }

     @JsonProperty("some_property")
     public String getSomeProperty() {
         return someProperty;
     }
 }

2 个答案:

答案 0 :(得分:0)

您可以选择用于JSON的命名约定。在这种情况下,您需要SNAKE_CASE。它会将someProperty字段转换为"some_property": "" JSON。然后你不需要属性中的@JsonProperty。

ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);

在这种情况下,在Foo中,你需要在构造函数中提供字段,这需要构造函数params中的@JsonProperty:

public class Foo {

   public final String someProperty;

   @JsonCreator
   public Foo(@JsonProperty("some_property") String someProperty) {
       this.someProperty = someProperty;
   }

   public String getSomeProperty() {
       return someProperty;
   }
}

至少你可以摆脱其中一个注释。

答案 1 :(得分:0)

优化您对不可变对象的理解。 没有setter,对象仍然是不可变的。

public class Foo
{
  @JsonProperty("some_property")
  public String someProperty;

  public String getSomeProperty()
  {
    return someProperty;
  }

  @Override
    public String toString()
  {
        return ToStringBuilder.reflectionToString(
            this,
            ToStringStyle.SHORT_PREFIX_STYLE);
  }
}