как вызвать парсер по умолчанию (зарегистрированный в маппере) из кастомного десериализатора

1

Мне нужно предоставить настраиваемую десериализацию Карты, а затем каждый объект Property должен быть сериализован по сериализатору по умолчанию. Эта карта является частью другого объекта:

class PropertiesHolder {
    Map<String, Property> properties;
}

Я определил mixin для класса PropertiesHolder:

class PropertiesHolderMixIn {
    @JsonSerialize(using=PropertiesSerializer.class)
    @JsonDeserialize(using=PropertiesDeserializer.class)
    Map<String, Property> properties;
}

У меня также есть mixin для класса Property. Инициализация ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.setMixInAnnotation(Property.class, PropertyMixIn.class);
module.setMixInAnnotation(PropertiesHolder.class, PropertiesHolderMixIn.class);
mapper.registerModule(module);

Мой десериализатор:

class PropertiesDeserializer extends JsonDeserializer<Map<String, Property>> {
    public Map<String, Property> deserialize(JsonParser jp, DeserializationContext ctxt) throws ... {
        ArrayNode node = (ArrayNode) jp.readValueAsTree();
        for (int i = 0, size = node.size() ; i < size ; i++) {
            ObjectNode jn = (ObjectNode) node.get(i);
            String key = jn.get("propertyName").textValue();
            String value = jn.get("propertyValue").toString();
            ... HERE I need to call registered deserializer for Property class over value ...
        }
    }
}

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

Пожалуйста, укажите мне решение. Где я могу получить десериализатор по умолчанию для объекта Property?

благодаря

Теги:
jackson

2 ответа

0
Лучший ответ

Проблема в том, что вам понадобится полностью сконструированный десериализатор по умолчанию; и для этого требуется, чтобы он строился, а затем ваш десериализатор получает к нему доступ. DeserializationContext - это не то, что вы должны либо создавать, либо изменять; он будет предоставлен ObjectMapper

Итак, все, что вам нужно написать в методе deserialize() это:

ObjectMapper mapper = (ObjectMapper)jp.getCodec();
Property property = mapper.readValue(jn.get("propertyValue").toString(), Property.class));
0

Решение - это строка кода:

ObjectMapper mapper = (ObjectMapper)jp.getCodec();

Вызовите этот метод в методе "deserialize (...)". Поэтому важным (для меня) фрагментом кода является:

ObjectMapper mapper = (ObjectMapper)jp.getCodec();
Property property = mapper.readValue(jn.get("propertyValue").toString(), Property.class));

Найдено в этом блоге.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню