Джексон: десериализация интерфейса / абстрактного класса с BeanDeserializerModifier - PullRequest
0 голосов
/ 07 ноября 2019

Мне нужно десериализовать JSON, но я могу управлять созданием объекта. Поскольку мне нужно заглянуть в содержимое объекта JSON, чтобы иметь возможность построить объект, я выбрал JsonDeserializer, ValueInstantiator не может сбросить парсер или заменить его парсером из TreeNode, поэтому я 'm осталось с пользовательским JsonDeserializer.

. Проблема теперь в том, что я получаю исключение, когда хочу десериализовать с сериализатором по умолчанию в созданный мной объект, говоря, что AbstractDeserializer не может десериализовать вобъект. Я десериализирую интерфейсный / абстрактный тип класса, который имеет геттеры и сеттеры, что-то вроде

interface MyInterface {
  String getName();
  void setName(String name);
}

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

SimpleModule module = new SimpleModule();
objectMapper.registerModule(module);
module.setDeserializerModifier(new BeanDeserializerModifier() {
    @Override
    public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
        if (special.contains(beanDesc.getBeanClass())) {
            return new MyDeserializer(deserializer);
        }
        return deserializer;
    }
});


public class MyDeserializer extends JsonDeserializer {
    @Override
    public Object deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        ObjectCodec codec = jsonParser.getCodec();
        JsonNode treeNode = codec.readTree(jsonParser);
        JsonNode jsonNode = treeNode.get("someAttribute");
        Object reference = //...
        jsonParser = codec.treeAsTokens(treeNode);
        jsonParser.nextToken();
        return defaultDeserializer.deserialize(jsonParser, deserializationContext, reference);
    }
}

Я получаю исключение

java.lang.UnsupportedOperationException: Can not update object of type com.example.MyObject (by deserializer of type com.fasterxml.jackson.databind.deser.AbstractDeserializer)
    at com.fasterxml.jackson.databind.JsonDeserializer.deserialize(JsonDeserializer.java:126) ~[jackson-databind-2.8.8.jar:2.8.8]
    at com.example.MyDeserializer.deserialize(MyDeserializer.java) ~[classes/:na]
...