如何序列化仅持有Map属性的POJO?

时间:2019-06-01 21:50:09

标签: java json jackson

我正在尝试使用两个公共类序列化POJO(EntriesResponse类),将其作为类中唯一属性(映射)的键/值对。 POJO目前仅保存此Hashmap,因此这是唯一要序列化的实体。问题是,如果Hashmap为空,我将得到如下输出:

{
    "entries": {}
}

但是当我将任何键/值对放置到地图上时,什么都不会返回(实际上什么也没有)。因此,我猜想序列化地图时会出现问题,但是没有发现异常。到目前为止,我可以看到Key和Value类(它们都不相同)都具有toString,hashCode,equals等方法,我认为这是Jackson序列化所需的全部,但是我可能错了。我必须提到,这些KeyClass和ValueClass(如下图所示)是公共类,但我不愿意扩展或修改它们(如果可能),因此我正在寻找一种解决方案,其中不对这些类进行任何修改或扩展。需要。我尝试返回Map的属性类型,并且可以正常工作,正如我说的那样,我很确定错误来自于使用特殊的键和值类。

上述Java类的一些示例:

EntriesResponse(POJO):

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
        "entries"
})

public class EntriesResponse implements Serializable {

    @JsonProperty("entries")
    private Map<KeyClass, ValueClass> mapEntries = null;


    public EntriesResponse(){
        this.mapEntries = new HashMap<>();
    }

    public Map<KeyClass, ValueClass> getMapEntries () {
        return this.mapEntries ;
    }

    public void setMapEntries (Map<KeyClass, ValueClass> mapEntries) {
        this.mapEntries = mapEntries;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (!(o instanceof EntriesResponse )) {
            return false;
        }
        EntriesResponse that = (EntriesResponse ) o;
        return Objects.equals(getMapEntries(), that.getMapEntries());
    }

    @Override
    public int hashCode() {
        return Objects.hash(getMapEntries());
    }

}

我如何序列化POJO:

ObjectMapper mapper = new ObjectMapper();

String json = "";

try {
    json = mapper.writeValueAsString(entriesResponse);
} catch (Exception e) {
    e.printStackTrace();
}

一个近端。上面的Map的KeyClass(也可以适用于ValueClass)的示例:

public class KeyClass{

    /*A prioiri, irrelevant code here*/

    @Override
    public int hashCode() {
        return /*Code*/;
    }

    @Override
    public boolean equals(final Object o) {
        /*Code*/
    }

    @Override
    public String toString() {
        final StringBuilder builder = new StringBuilder(/*size*/);
        /*More code*/
        return builder.toString();
    }

    /*A priori, irrelevant code here*/
}

0 个答案:

没有答案