我处理的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;
}
}
答案 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);
}
}