Сериализация карт по умолчанию производит этот
{"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();
}
}
Решил мою проблему, если кому-то интересно. Но все же я открыт для более элегантных решений.