gpt4 book ai didi

java - 自定义 jackson 解码行为

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:26:20 25 4
gpt4 key购买 nike

我正在使用 Jackson fasterxml 解码 JSON。在我的对象中有两种属性:输入属性和计算属性。在输入 JSON 中,我只获得输入值。

计算值实际上取决于输入值。我必须在引用对象之前填充这些值。所以我只是检查 Jackson 是否提供了任何钩子(Hook),以便我可以在那里进行计算。例如 JAXB 提供 afterUnmarshal 方法来自定义解码行为:

void afterUnmarshal(Unmarshaller u, Object parent)

但是我找不到关于自定义 Jackson 的类似信息。 Jackson 是否提供任何此类框架 Hook 来自定义解码行为?

最佳答案

我宁愿建议使用 constructor creators 来保持模型对象不可变.也就是说,所有 JSON 值都传递给构造函数,该构造函数将初始化其他计算属性。

无论如何,如果您想在反序列化后自定义对象(无需为每种类型编写反序列化器),您可以 modify the deserializer在某种程度上,它最终会调用新构造实例的特殊方法。这是一个适用于所有实现特殊接口(interface)的类的示例(可以考虑使用注释来标记后构造方法)。

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));
}

}

输出:

Post construct: Bean{field='value'}
Bean{field='value'}

关于java - 自定义 jackson 解码行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24208087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com