CommonsLangDeserializers.java
package top.infra.jackson2;
import com.fasterxml.jackson.databind.BeanDescription;
import com.fasterxml.jackson.databind.DeserializationConfig;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.deser.DeserializerFactory;
import com.fasterxml.jackson.databind.deser.Deserializers;
import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
import com.fasterxml.jackson.databind.type.TypeFactory;
import org.apache.commons.lang3.tuple.Pair;
import top.infra.jackson2.deser.PairDeserializer;
/**
* {@link com.fasterxml.jackson.databind.deser.BasicDeserializerFactory#findDefaultDeserializer(DeserializationContext, JavaType, BeanDescription)}
* {@link com.fasterxml.jackson.databind.deser.BeanDeserializerFactory}
* com.fasterxml.jackson.datatype.guava.GuavaDeserializers
*/
public class CommonsLangDeserializers extends Deserializers.Base {
private final DeserializerFactory deserializerFactory;
public CommonsLangDeserializers(final DeserializerFactory deserializerFactory) {
this.deserializerFactory = deserializerFactory;
}
@Override
public JsonDeserializer<?> findBeanDeserializer(
final JavaType type, final DeserializationConfig config, final BeanDescription beanDesc
) throws JsonMappingException {
if (type.hasRawClass(Pair.class)) {
JavaType kt = type.containedType(0);
if (kt == null) {
kt = TypeFactory.unknownType();
}
TypeDeserializer kts = (TypeDeserializer) kt.getTypeHandler();
if (kts == null) {
kts = this.deserializerFactory.findTypeDeserializer(config, kt);
}
JavaType vt = type.containedType(1);
if (vt == null) {
vt = TypeFactory.unknownType();
}
TypeDeserializer vts = (TypeDeserializer) vt.getTypeHandler();
if (vts == null) {
vts = this.deserializerFactory.findTypeDeserializer(config, vt);
}
JsonDeserializer<Object> valueDeser = vt.getValueHandler();
JsonDeserializer<Object> keyDes = kt.getValueHandler();
return new PairDeserializer(type, keyDes, kts, valueDeser, vts);
}
return null;
}
}