我需要反序列化JSON,但能够控制对象实例化。因为我需要窥视JSON对象内容来构造对象,所以我使用了一个
JsonDeserializer
,的
ValueInstantiator
TreeNode
,所以我有个习惯
.
AbstractDeserializer
无法反序列化到对象中。我正在反序列化一个接口/抽象类类型,它有getter和setter,类似于
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]