问题描述
我想反序列化在依赖项中定义的不可变类,因此无法修改。它只有一个私有构造函数,必须使用构建器构建。
借助Jackson,可以使用@JsonDeserialize(builder = SomeClass.SomeClassBuilder.class)
来反序列化此类对象。不幸的是,我无法添加注释。
是否可以在不使用注释的情况下注册这样的构建器?如果是,那么您将如何进行呢?
解决方法
您可能想看看示例here(在Google BTW上首次点击):
定义自定义反序列化器:
public class SomeClassDeserializer extends StdDeserializer<SomeClass> {
public SomeClassDeserializer() {
this(null);
}
public SomeClassDeserializer(Class<?> vc) {
super(vc);
}
@Override
public SomeClass deserialize(JsonParser jp,DeserializationContext ctxt)
throws IOException,JsonProcessingException {
JsonNode node = jp.getCodec().readTree(jp);
// read values from node and use the SomeClassBuilder
// to create an instance of SomeClass
}
}
通过向ObjectMapper
注册反序列化器,使Jackson知道反序列化器:
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addDeserializer(SomeClass.class,new SomeClassDeserializer());
mapper.registerModule(module);
SomeClass readValue = mapper.readValue(json,SomeClass.class);
根据您使用的框架,可能会有其他更优雅的方式来注册反序列化器。