Используете собственный маршаллер в Джексоне без аннотаций? - PullRequest
2 голосов
/ 16 января 2012

Мне нужно использовать Джексона, чтобы маршалировать и демаршировать json для произвольных объектов, и мне нужен определенный формат даты.

Прямо сейчас у меня есть это:

final ObjectMapper mapper = new ObjectMapper()
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true)
mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true)

Когда я запускаю mapper.writeValueAsString([a:new Date()]), я получаю метку времени. Мое предыдущее решение для маршалинга использовало это:

ISODateTimeFormat.dateTime().withZoneUTC().print(it.getTime())

но я могу только найти способ установить конкретного маршаллера в Джексоне с аннотациями. У меня есть несколько классов, для которых мне нужно особое маршалинг, ни один из которых не может быть аннотирован. Есть ли способ настроить маршалер по классам?

1 Ответ

2 голосов
/ 16 января 2012

Создайте модуль и добавьте в него сериализаторы для каждого типа.

class ApiDateSerializer extends JsonSerializer<Date> {
    void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) {
        String dateString = ISODateTimeFormat.dateTime().withZoneUTC().print(date.getTime())
        jsonGenerator.writeString(dateString);
    }
}
...
  mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true)
        mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true)
        Module queryModule = new SimpleModule("QueryModule", new Version(1, 0, 0, null))
        queryModule.addSerializer(Date.class, new ApiDateSerializer());
        mapper.registerModule(queryModule)
...