实体属性序列化两次

时间:2013-09-25 20:07:27

标签: java json spring jackson

在Spring 3.3中,我有一个映射到数据库表的实体。在这个实体类中,我有使用@JsonProperty注释的所有属性,例如@JsonProperty(“ID”)。 进入控制器,调用服务以通过使用DAO /存储库来获取此类实体。这很好用但是当我使用@ResponseBody将此实体发送回请求者时,所有属性都会被发送两次。一旦要求,但再一次开始小写直到第一个驼峰案件出现。 一个例子......

public class MyEntity {
    @JsonProperty("MYSpecialSuperId")
    private String MYSpecialSuperId;

    ...

    public String getMYSpecialSsuperId() {
        return this.MYSpecialSuperId;
    }

}

JSON字符串化结果后:

{ "MYSpecialSuperId":""9", "myspecialSuperId":"9" }

为什么结果中的属性两次,为什么字体不同?

顺便说一句: 我的想法是让Java属性以大写字母开头,即使有一个以上的大写字母。

2 个答案:

答案 0 :(得分:8)

杰克逊的ObjectMapper使用Java bean模式。换句话说,它需要以下

public class Foo {
    public Object bar;

    public Object getBar() {...}

    public void setBar(Object bar) {...}
}

getter和setter分别以getset开头,后跟相应的字段名称,首字母大写。如果您将代码更改为

public class MyEntity {
    @JsonProperty("MYSpecialSuperId")
    private String mySpecialSuperId;

    ...

    public String getMySpecialSuperId() {
        return this.mySpecialSuperId;
    }

}

请注意,该字段以小写my而不是大写字母开头(无论@JsonProperty值如何),我删除了s中的额外getMYSpecialSsuperId并使用了小写字母{ {1}}。所以现在字段名称与getter名称匹配,jackson知道属性是相同的,不需要序列化两次。

如果您别无选择,可以按照Katona posted in the comments进行操作并使用

y

让jackson完全忽略getter,只使用字段来序列化你的JSON。

答案 1 :(得分:1)

我认为你的访问者中有一个拼写错误;如果它有" SsuperId"它与该字段的名称不匹配;因此,字段和getter意味着不同的逻辑属性。