Custom Json Serializer Loop - PullRequest
       0

Custom Json Serializer Loop

0 голосов
/ 13 февраля 2020

Сериализация карт по умолчанию производит этот

{"key1":"value1","key2":"value2"}

, и я хочу иметь собственный сериализатор карт для сериализации карт в формате

{"map":{"key1":"value1","key2":"value2"}}

Я попытался изменить pojo, чтобы сохранить Map<String,Map<String,String>> вместо Map<String,String>, чтобы я мог поставить свою карту с ключом map, и сериализация работала бы так, как я хочу. Однако я не хочу нарушать pojo, поскольку он используется во многих других местах. И я не хочу хранить его дубликаты, просто чтобы добавить эту функциональность, так как будет сложно поддерживать их оба.

Так что я закончил с созданием класса JsonSerializer for Map. Однако я не мог заставить это работать, как я хочу. Моя первая попытка заключается в следующем:

public class CustomMapSerializer extends JsonSerializer<Map> {

ObjectMapper mapper = new ObjectMapper();

@Override
public void serialize(final Map value, final JsonGenerator gen, final SerializerProvider serializers) throws
        IOException {
    gen.writeStartObject();
    gen.writeFieldName("map");
    gen.writeObject(mapper.writeValueAsString(value));
    gen.writeEndObject();

}
}

Однако вывод становится {"map":"{\"key1\":\"value1\",\"key2\":1,\"key3\":true}"} Поскольку mapper записывает значение как String, а JsonGenerator :: writeObject делает еще один ObjectMapper :: writeValue, \ отображаются экранирующие символы.

Так как это не сработало, я подумал, хорошо, тогда я не буду сериализовывать карту в String, поэтому JsonGenerator может правильно сериализовать мою карту. Однако здесь все рухнуло: StackOverflowException!

public class CustomMapSerializer extends JsonSerializer<Map> {

@Override
public void serialize(final Map value, final JsonGenerator gen, final SerializerProvider serializers) throws
        IOException {
    gen.writeStartObject();
    gen.writeFieldName("map");
    gen.writeObject(value);
    gen.writeEndObject();

}
}

Поскольку я зарегистрировал CustomMapSerializer для класса Map, он снова вызывается для gen.writeObject(value);, поэтому он переходит в al oop.

В качестве следующего шага я собирался взять OutputBuffer и проверить, не пустой ли он, но это вовсе не похоже на правильное решение.

Так может кто-нибудь предложить хорошее простое решение для моего довольно простая проблема?

Спасибо !!

Редактировать:

public class CustomMapSerializer extends JsonSerializer<Map> {

ObjectMapper mapper = new ObjectMapper();

@Override
public void serialize(final Map value, final JsonGenerator gen, final SerializerProvider serializers) throws
        IOException {
    gen.setCodec(mapper);
    gen.writeStartObject();
    gen.writeFieldName("map");
    gen.writeObject(value);
    gen.writeEndObject();

}
}

Решил мою проблему, если кому-то интересно. Но все же я открыт для более элегантных решений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...