在 Jackson 中,自定义反序列化器允许扩展或修改默认反序列化行为。常见的需求是在应用自定义逻辑之前访问默认反序列化器以部分反序列化对象。但是,直接从自定义反序列化器中调用 deserialize 会导致堆栈溢出异常。
要解决此问题,可以实现 BeanDeserializerModifier 并使用 SimpleModule 注册。此修饰符可以在反序列化器创建过程中进行干预,并将默认反序列化器注入到我们自定义的反序列化器中。
以下代码演示了如何实现此目的:
import com.fasterxml.jackson.databind.BeanDescription; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.module.BeanDeserializerModifier; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.util.StdDeserializer; public class UserEventDeserializer extends StdDeserializer<User> implements ResolvableDeserializer { private static final long serialVersionUID = 7923585097068641765L; private final JsonDeserializer<?> defaultDeserializer; public UserEventDeserializer(JsonDeserializer<?> defaultDeserializer) { super(User.class); this.defaultDeserializer = defaultDeserializer; } @Override public User deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException { User deserializedUser = (User) defaultDeserializer.deserialize(jp, ctxt); // Special logic return deserializedUser; } // for some reason you have to implement ResolvableDeserializer when modifying BeanDeserializer // otherwise deserializing throws JsonMappingException?? @Override public void resolve(DeserializationContext ctxt) throws JsonMappingException { ((ResolvableDeserializer) defaultDeserializer).resolve(ctxt); } public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { SimpleModule module = new SimpleModule(); module.setDeserializerModifier(new BeanDeserializerModifier() { @Override public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) { if (beanDesc.getBeanClass() == User.class) return new UserEventDeserializer(deserializer); return deserializer; } }); ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(module); User user = mapper.readValue(new File("test.json"), User.class); } }
通过向 ObjectMapper 注册此模块,可以启用 User 类的自定义反序列化,从而允许访问默认的反序列化器用于在应用自定义逻辑之前预填充对象。
以上是如何访问自定义 Jackson 解串器中的默认解串器?的详细内容。更多信息请关注PHP中文网其他相关文章!