У меня есть Range
, что мне нужно сериализовать в определенном формате, а именно "[lower,upper)"
. Для этого я написал основную сериалайзер:Сериализованный диапазон с Jackson
public class RangeSerializer extends StdSerializer<Range<?>> {
@Override
public void serialize(final Range<?> value, final JsonGenerator gen, final SerializerProvider provider) throws IOException {
if (value != null) {
gen.writeRaw('"');
gen.writeRaw('[');
provider.defaultSerializeValue(value.lowerEndpoint(), gen);
gen.writeRaw(',');
provider.defaultSerializeValue(value.upperEndpoint(), gen);
gen.writeRaw(')');
gen.writeRaw('"');
}
}
(Обратите внимание, что в действительности сериализатор обрабатывает различные возможности Range
, таких как закрытые/открытые диапазоны, возможность неограниченных диапазонов на обоих концах, и т.д., но для в целях моего вопроса, который не имеет значения, поэтому я удалил его, чтобы код был прост).
Моя проблема заключается в том, что, возвращаясь к серийному сериализатору по умолчанию для каждого класса, я заканчиваю кавычками в неправильном месте. Например, если у меня был Range<String>
с записью "[foo,bar)"
, то при ее сериализации я получаю "["foo","bar")"
. Мне нужен результат без кавычек вокруг значений нижней и верхней конечных точек.
Я понимаю, что дополнительные кавычки связаны с тем, что gen.writeString()
в базовом сериализаторе не понимает, что он уже находится в строке. Есть ли способ сообщить генератору об этом или альтернативный способ добиться того, что я пытаюсь сделать?
Обратите внимание, что Range<?>
действительно является общим, поэтому я не могу жестко кодировать сериализацию значений. Он должен работать для Range<Integer>
, Range<String>
, Range<DateTime>
и всего остального.
Спасибо за ответ. Конвертер - интересный способ делать что-то, но может ли он быть зарегистрирован так же, как сериализаторы и десериализаторы могут быть зарегистрированы или их нужно прикреплять аннотацией? У меня нет доступа к самому классу Range, и этот диапазон фактически используется в качестве ключа для карты, поэтому я не уверен, что решение на основе аннотаций поможет мне здесь. – jgm
Используйте mixin для добавления аннотации к классу Range. Я отредактировал свой ответ, чтобы показать, как это сделать. Обратите внимание на часть 'addMixin (...)', сконфигурированную на mapper. –