我在 Spring 使用Jackson来将我的类序列化为JSON。当我像下面的示例那样序列化一个类时,Jackson会将某些字段的名称从Camel Case更改为小写。我知道我可以通过创建自定义(反)序列化器来解决此问题,但我希望在全局范围内将其关闭。也许通过在application.properties中设置一个属性。
按照default Jackson naming strategy,这不应该发生:
class Foo {
private final String firstName;
private final String aName;
private final String name;
private final String abName;
Foo(final String firstName, final String aName, final String name, final String abName) {
this.firstName = firstName;
this.aName = aName;
this.name = name;
this.abName = abName;
}
// Getters here
}
public static void main(String[] args) {
final ObjectMapper mapper = new ObjectMapper();
final Foo foo = new Foo("first", "a", "name", "ab");
final String jsonInString = mapper.writeValueAsString(foo);
System.out.println(jsonInString);
}
预期:{“firstName”:“first”,“name”:“名称”,“abName”:“ab”,“ aName ”:“a”}
实际:
{“firstName”:“first”,“name”:“名称”,“abName”:“ab”,“ aname ”:“a”}
编辑:
将问题缩小到解释 setter/getter 。开始看起来像 jackson 中的错误。
class Foo {
private final String aName;
Foo(final String aName) {
this.aName = aName;
}
public String getaName() {
return this.aName;
}
}
序列化为{"aName":"a"}
然而,class Foo {
private final String aName;
Foo(final String aName) {
this.aName = aName;
}
public String getAName() {
return this.aName;
}
}
序列化为{"aname":"a"}
最佳答案
这里的问题更多是关于JavaBeans(TM) Specification。根据规范(第58页)
而且您有一个带有aName
field的小巧包。因为如果 setter/getter 看起来像AName()
,那么当您从该 setter/getter 转换回去时,您应该根据规范查找AName
字段。这是其他信息explanation
因此,要解决此问题,您可以在field/getter上方使用适当的getter(getaName()
)或@JsonProperty("aName")
批注
这是similar question