View Javadoc
1   package top.infra.jackson2;
2   
3   import com.fasterxml.jackson.databind.BeanDescription;
4   import com.fasterxml.jackson.databind.DeserializationConfig;
5   import com.fasterxml.jackson.databind.DeserializationContext;
6   import com.fasterxml.jackson.databind.JavaType;
7   import com.fasterxml.jackson.databind.JsonDeserializer;
8   import com.fasterxml.jackson.databind.JsonMappingException;
9   import com.fasterxml.jackson.databind.deser.DeserializerFactory;
10  import com.fasterxml.jackson.databind.deser.Deserializers;
11  import com.fasterxml.jackson.databind.jsontype.TypeDeserializer;
12  import com.fasterxml.jackson.databind.type.TypeFactory;
13  
14  import org.apache.commons.lang3.tuple.Pair;
15  
16  import top.infra.jackson2.deser.PairDeserializer;
17  
18  /**
19   * {@link com.fasterxml.jackson.databind.deser.BasicDeserializerFactory#findDefaultDeserializer(DeserializationContext, JavaType, BeanDescription)}
20   * {@link com.fasterxml.jackson.databind.deser.BeanDeserializerFactory}
21   * com.fasterxml.jackson.datatype.guava.GuavaDeserializers
22   */
23  public class CommonsLangDeserializers extends Deserializers.Base {
24  
25      private final DeserializerFactory deserializerFactory;
26  
27      public CommonsLangDeserializers(final DeserializerFactory deserializerFactory) {
28          this.deserializerFactory = deserializerFactory;
29      }
30  
31      @Override
32      public JsonDeserializer<?> findBeanDeserializer(
33          final JavaType type, final DeserializationConfig config, final BeanDescription beanDesc
34      ) throws JsonMappingException {
35          if (type.hasRawClass(Pair.class)) {
36              JavaType kt = type.containedType(0);
37              if (kt == null) {
38                  kt = TypeFactory.unknownType();
39              }
40              TypeDeserializer kts = (TypeDeserializer) kt.getTypeHandler();
41              if (kts == null) {
42                  kts = this.deserializerFactory.findTypeDeserializer(config, kt);
43              }
44  
45              JavaType vt = type.containedType(1);
46              if (vt == null) {
47                  vt = TypeFactory.unknownType();
48              }
49              TypeDeserializer vts = (TypeDeserializer) vt.getTypeHandler();
50              if (vts == null) {
51                  vts = this.deserializerFactory.findTypeDeserializer(config, vt);
52              }
53              JsonDeserializer<Object> valueDeser = vt.getValueHandler();
54              JsonDeserializer<Object> keyDes = kt.getValueHandler();
55              return new PairDeserializer(type, keyDes, kts, valueDeser, vts);
56          }
57          return null;
58      }
59  }