du-*_*-it 4 java spring json jackson
在Spring 3.3中,我有一个映射到数据库表的实体.在这个实体类中,我有使用@JsonProperty注释的所有属性,例如@JsonProperty("ID").进入控制器,调用服务以通过使用DAO /存储库来获取此类实体.这很好用但是当我使用@ResponseBody将此实体发送回请求者时,所有属性都会被发送两次.一旦要求,但再一次开始小写直到第一个驼峰案件出现.一个例子...
public class MyEntity {
@JsonProperty("MYSpecialSuperId")
private String MYSpecialSuperId;
...
public String getMYSpecialSsuperId() {
return this.MYSpecialSuperId;
}
}
Run Code Online (Sandbox Code Playgroud)
在JSON字符串化后,结果是:
{ "MYSpecialSuperId":""9", "myspecialSuperId":"9" }
Run Code Online (Sandbox Code Playgroud)
为什么结果中的属性是两次,为什么字体不同?
顺便说一句:我的想法是让Java属性以大写字母开头,即使还有一个以上的大写字母.
杰克逊ObjectMapper使用Java bean模式.换句话说,它期望以下
public class Foo {
public Object bar;
public Object getBar() {...}
public void setBar(Object bar) {...}
}
Run Code Online (Sandbox Code Playgroud)
getter和setter 分别以get和set第一个字母大写的相应字段名开头.如果您将代码更改为
public class MyEntity {
@JsonProperty("MYSpecialSuperId")
private String mySpecialSuperId;
...
public String getMySpecialSuperId() {
return this.mySpecialSuperId;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,该字段以小写my而不是大写开头(无论@JsonProperty值如何),我删除了额外s的内容getMYSpecialSsuperId并使用了小写字母y.所以现在字段名称与getter名称匹配,jackson知道属性是相同的,不需要序列化两次.
如果您别无选择,可以按照Katona在评论和使用中发布的内容进行操作
@JsonAutoDetect(getterVisibility=Visibility.NONE)
Run Code Online (Sandbox Code Playgroud)
让jackson完全忽略getter,只使用字段来序列化你的JSON.