Проблема:
У меня есть группа DTOs
со структурой вроде этого:
public class Foobar {
private String name;
private Timestamp time1;
private Timestamp time2;
private int value;
}
Мне нужно сериализовать значения Timestamps
до двух разных (один раз .toString()
и один раз отформатирован в соответствии со стандартом ISO), чтобы быть обратно совместимым со старым API, а также поддерживать с сегодняшнего дня - достойный формат времени.
Итак, вывод JSON
для Foobar должен выглядеть так:
{
"name":"<some name>",
"time1":"<some non standard time>",
"iso_time1":"<ISO formatted time>",
"time2":"<some non standard time>",
"iso_time2":"<ISO formatted time>",
"value":<some number>
}
Я ограничен Gson из-за существующего кода.
Вопрос:
Возможно ли это сделать общим способом, который будет работать для всех моих DTOs
без изменения DTOs
?
Я хочу, чтобы не писать TypeAdapter/Serializer/new DTO
для каждого из моих существующих DTO.
Что я пробовал
TypeAdapter
Я уже пытался сделать это с помощью TypeAdapter
и TypeAdapterFactory
, но мне нужно имя поля этого класса, чтобы выделить две метки времени.
write(...)
метод TypeAdapter
, иллюстрирующий проблему, с которой я столкнулся (T extends Timestamp
):
@Override
public void write(final JsonWriter out, final T value) throws IOException {
out.value(value.toString());
out.name(TIMESTAMP_ISO_PREFIX + fieldName).value(toISOFormat(value));
}
Проблема здесь в том, что я не нашел способа получить имя поля. Я попытался получить его с помощью TypeAdapterFactory
, но factory также не знает имя поля.
JsonSerializer
Я также пытался сделать это с помощью JsonSerializer
, но невозможно вернуть два элемента JSON, и возврат JsonObject нарушит существующий API.