JsonAnyGetter / JsonAnySetter生成的JSON具有加倍的值

时间:2017-08-15 15:49:42

标签: java json jackson

我需要编写一个遵循这种基本格式的JSON字符串:

"gesamtAngebot":{
    "angebotList":[{
        "instanzId":"string",
        "buchungsKontextList":[{
            "quellSystem":"SOMETHING",
            "payload":{}
        }],
        "payload":{"test1":"test1"}
    }]
}

我使用以下类来呈现数据,并使用Jackson ObjectMapper序列化此类的实例。

@Data
public class Angebot {

    private String instanzId;

    private List<BuchungsKontext> buchungsKontextList;

    private Map<String, Object> payload = new HashMap<String, Object>();

    @JsonAnyGetter
    public Map<String, Object> any() {
        return payload;
    }

    @JsonAnySetter
    public void set(String name, Object value) {
        payload.put(name, value);
    }
}

如果我按原样序列化此类的实例,生成的JSON将是这样的:

"gesamtAngebot":{
    "angebotList":[{
        "instanzId":"string",
        "buchungsKontextList":[{
            "quellSystem":"SOMETHING",
            "payload":{}
        }],
        "payload":{"test1":"test1"},
        "test1":"test1"
    }]
}

正如你所看到的那样,“有效载荷”的数据加倍,因为它是自己的元素,我不知道为什么。

提前感谢您的关注和建议。

2 个答案:

答案 0 :(得分:0)

您似乎希望将payload序列化为普通地图。因此,如果您不想要它两次,那么您不应该使用any()方法,只需要payload的常规getter方法。

如果您想要将any()地图中的所有项目序列化为payload类的属性,则可以使用Angebot方法。然后,您将使用any方法,而不是payload的getter。

你的JSON会像这样出现:

"gesamtAngebot":{
    "angebotList":[{
        "instanzId":"string",
        "buchungsKontextList":[{
            "quellSystem":"SOMETHING",
            "payload":{}
        }],
        "test1":"test1"
    }]
}

看起来test1Angebot类的变量。

答案 1 :(得分:0)

这是因为any()吸气剂。只需删除它:

@Data
public class Angebot {

    private String instanzId;

    private List<BuchungsKontext> buchungsKontextList;

    private Map<String, Object> payload = new HashMap<String, Object>();

//    @JsonAnyGetter
//    public Map<String, Object> any() {
//        return payload;
//    }

    @JsonAnySetter
    public void set(String name, Object value) {
        payload.put(name, value);
    }
}

payload是类属性。由于@Data注释,它会自然地反序列化。 any() getter会造成双重性。