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'}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值