Pra*_*nth 3 java json jaxb jackson
我使用Jackson fasterxml来解组JSON.在我的对象中有两种属性:输入属性和计算属性.在输入JSON中,我只获得输入值.
计算值实际上取决于输入值.我必须在引用对象之前填充这些值.所以我只是检查杰克逊是否有任何钩子,以便我可以在那里进行计算.例如,JAXB提供afterUnmarshal方法来自定义解组行为:
void afterUnmarshal(Unmarshaller u, Object parent)
Run Code Online (Sandbox Code Playgroud)
但我找不到关于定制杰克逊的类似信息.杰克逊是否提供了任何此类框架钩子来定制解组行为?
我宁愿建议使用构造函数创建器使模型对象保持不变.也就是说,所有JSON值都传递给构造函数,该构造函数将初始化其他计算属性.
无论如何,如果你想在反序列化后自定义一个对象(不为每个类型编写反序列化器),你可以修改反序列化器,最后它调用一个新构造的实例的特殊方法.这是一个适用于实现特殊接口的所有类的示例(可以考虑使用注释来标记post构造方法).
public class JacksonPostConstruct {
public static interface PostConstructor {
void postConstruct();
}
public static class Bean implements PostConstructor {
private final String field;
@JsonCreator
public Bean(@JsonProperty("field") String field) {
this.field = field;
}
public void postConstruct() {
System.out.println("Post construct: " + toString());
}
@Override
public String toString() {
return "Bean{" +
"field='" + field + '\'' +
'}';
}
}
private static class PostConstructDeserializer extends DelegatingDeserializer {
private final JsonDeserializer<?> deserializer;
public PostConstructDeserializer(JsonDeserializer<?> deserializer) {
super(deserializer);
this.deserializer = deserializer;
}
@Override
protected JsonDeserializer<?> newDelegatingInstance(JsonDeserializer<?> newDelegatee) {
return deserializer;
}
@Override
public Object deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
Object result = _delegatee.deserialize(jp, ctxt);
if (result instanceof PostConstructor) {
((PostConstructor) result).postConstruct();
}
return result;
}
}
public static void main(String[] args) throws IOException {
ObjectMapper mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config,
BeanDescription beanDesc,
final JsonDeserializer<?> deserializer) {
return new PostConstructDeserializer(deserializer);
}
});
mapper.registerModule(module);
String json = "{\"field\":\"value\"}";
System.out.println(mapper.readValue(json, Bean.class));
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Post construct: Bean{field='value'}
Bean{field='value'}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3085 次 |
| 最近记录: |