Мне нужно десериализовать 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]