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
20
21
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 }