WedX - журнал о программировании и компьютерных науках

Добавление пользовательского класса десериализации в уже существующую аннотацию @JsonDeserialize с использованием jackson

Я пытаюсь десериализовать json, написав собственный десериализатор. Вот мой код.

public class EventLoginDeserializer extends StdDeserializer<EventLogin> {

    public EventLoginDeserializer() {
        this(null);
    }

    public EventLoginDeserializer(Class<EventLogin> event) {
        super(event);
    }

    @Override
    public EventLogin deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
            throws IOException, JsonProcessingException {
        JsonNode jsonNode = jsonParser.getCodec().readTree(jsonParser);
        return EventLogin.builder().displayName(jsonNode.get("display_name"))
                .timestamp(DateTime.now()).build();
    }

    @Override
    public Class<EventLogin> handledType() {
        return EventLogin.class;
    }
}

А вот фрагмент моего основного класса.

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

SimpleModule module = new SimpleModule();
module.addDeserializer(EventLogin.class, new EventLoginDeserializer());
mapper.registerModule(module);

String json = "{\"display_name\": \"Test Deserialization\", \"user_name\": \"test\"}";

EventLogin eventLogin = mapper.readValue(json, EventLogin.class);
System.out.println("readValue :::: " + eventLogin);

У меня есть требование, согласно которому я должен взять уже существующий аннотированный класс модели @JsonDeserialize в файле jar и добавить еще один класс десериализации выше. Я имел в виду, что здесь то же самое для уже существующего класса в исходном файле.

@AutoValue
@JsonDeserialize(builder = AutoValue_EventLogin.Builder.class)
@JsonInclude(JsonInclude.Include.NON_NULL)
public abstract class EventLogin
{
    public abstract String displayName();
    public abstract DateTime timestamp();

    @AutoValue.Builder
    public abstract static class Builder implements Login.Builder<Builder> {

    public abstract Builder displayName(String displayName);
        public abstract Builder emailId(DateTime timestamp);

        public abstract EventLogin build();
    }
}

Проблема в том, что, поскольку @JsonDeserialize уже существует в файле jar, добавление пользовательского десериализатора вообще не рассматривалось. Это означает, что переопределенный метод десериализации пользовательского класса десериализатора не выполняется.

Так как же победить эту проблему?


Ответы:


1

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

@JsonDeserialize(using = EventLoginDeserializer.class)
public static class EventLoginMixIn{}

а потом в нашем основном классе

ObjectMapper mapperWithMixin = new ObjectMapper()
        .addMixIn(EventLogin.class, EventLoginMixIn.class);

// Deserialize the eventlogin
EventLogin eventLogin = mapperWithMixin.readValue(actualJson, EventLogin.class);
07.10.2016
Новые материалы

Как проанализировать работу вашего классификатора?
Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

Работа с цепями Маркова, часть 4 (Машинное обучение)
Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

Учебные заметки: создание моего первого пакета Node.js
Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

ИИ в аэрокосмической отрасли
Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


Для любых предложений по сайту: [email protected]