Как сериализовать POJO, который содержит только атрибут Map? - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь сериализовать POJO (класс EntriesResponse) с двумя открытыми классами как пары ключ / значение единственного атрибута (Map) в классе.POJO только пока хранит эту Hashmap, так что это единственная сущность для сериализации.Проблема в том, что если Hashmap пуст, я получаю вывод, подобный этому:

{
    "entries": {}
}

Но когда я помещаю любую пару ключ / значение на карту, тогда ничего не возвращается (буквально ничего).Поэтому я предполагаю, что существует проблема с сериализацией карты, но исключений не обнаружено.Пока я вижу, что оба класса Key и Value (которые не совпадают) имеют методы toString, hashCode, equals и т. Д., И я подумал, что это все, что Джексону нужно было сериализовать, но я могу ошибаться.Я должен упомянуть, что эти 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();
}

АпроксПример 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*/
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...