天天看點

java jackson 自定義_java – 自定義jackson解組行為

我甯願建議使用

constructor creators保持模型對象不可變.也就是說,所有JSON值都傳遞給構造函數,該構造函數将初始化其他計算屬性.

無論如何,如果你想在反序列化後自定義一個對象(不為每個類型編寫一個反序列化器),你可以通過最終調用新構造執行個體的特殊方法的方式來實作modify the deserializer.這是一個适用于實作特殊接口的所有類的示例(可以考慮使用注釋來标記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));

}

}

輸出:

Post construct: Bean{field='value'}

Bean{field='value'}