停止杰克逊从变化的名称变量名称
我在Spring中使用杰克逊将我的类序列化为JSON。当我像下面的例子一样序列化一个类时,Jackson将某些字段的名称从Camel Case更改为小写字母。我知道我可以通过创建自定义(de)序列化器来解决此问题,但我希望能够在全局范围内关闭此功能。也许通过在application.properties中设置一个属性。停止杰克逊从变化的名称变量名称
每default Jackson naming strategy,这是不应该发生的:
在没有注册的自定义策略,默认的Java属性命名策略被使用,这让字段名是...
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);
}
预计:
{ “名字”: “第一”, “名”:“南E “ ”abName“: ”AB“,” aName “:” 一个 “}
实际:
{” 名字 “:” 第一”, “名称”: “姓名”, “abName”: “AB”, “aname ”:“ 一”}
编辑:
缩小问题下到干将解释。开始在杰克逊看起来像一个bug。
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页)
但是支持偶尔使用全大写的名字,我们 检查,如果前两个字符的名称都是大写和 如果是离开它单独
“fooBah”变成“fooBah”
“Z”变为“Z”
“URL”变成“URL”
而且您有一个aName
字段的边缘案例。因为如果吸气剂看起来像AName()
,那么当你从这个吸气剂转回来时,你应该根据规范寻找AName
字段。这是额外的信息explanation
因此,要解决这个问题,你可以使用适当的吸气剂(getaName()
)或@JsonProperty("aName")
注释以上场/吸气
虽然我不知道为什么杰克逊读取getAName
到aname
,有可能迫使杰克逊与@JsonProperty("AName")
使用某个名称。例如:(得到了this密切相关的问题,这种解决方案)
class Foo {
private final String aName;
Foo(final String aName) {
this.aName = aName;
}
@JsonProperty("AName")
public String getAName() {
return this.aName;
}
}
使用'@JsonProperty( “AName”)'你就完成了 – Optional