/src/test/java/com/alibaba/fastjson/deserializer/issues569/parser/ParserConfigBug569.java

https://github.com/alibaba/fastjson · Java · 194 lines · 157 code · 30 blank · 7 comment · 62 complexity · b7c3e4c36b9687865171e8994d66f0b7 MD5 · raw file

  1. package com.alibaba.fastjson.deserializer.issues569.parser;
  2. import com.alibaba.fastjson.JSONException;
  3. import com.alibaba.fastjson.annotation.JSONField;
  4. import com.alibaba.fastjson.annotation.JSONType;
  5. import com.alibaba.fastjson.parser.ParserConfig;
  6. import com.alibaba.fastjson.parser.deserializer.*;
  7. import com.alibaba.fastjson.serializer.AwtCodec;
  8. import com.alibaba.fastjson.serializer.CollectionCodec;
  9. import com.alibaba.fastjson.serializer.MiscCodec;
  10. import com.alibaba.fastjson.serializer.ObjectArrayCodec;
  11. import com.alibaba.fastjson.util.FieldInfo;
  12. import com.alibaba.fastjson.util.JavaBeanInfo;
  13. import com.alibaba.fastjson.util.ServiceLoader;
  14. import com.alibaba.fastjson.util.TypeUtils;
  15. import java.lang.reflect.ParameterizedType;
  16. import java.lang.reflect.Type;
  17. import java.lang.reflect.TypeVariable;
  18. import java.lang.reflect.WildcardType;
  19. import java.util.*;
  20. /**
  21. * Author : BlackShadowWalker
  22. * Date : 2016-10-10
  23. */
  24. public class ParserConfigBug569 extends ParserConfig {
  25. private static boolean awtError = false;
  26. private static boolean jdk8Error = false;
  27. private String[] denyList = new String[] { "java.lang.Thread" };
  28. public FieldDeserializer createFieldDeserializer(ParserConfig mapping, //
  29. JavaBeanInfo beanInfo, //
  30. FieldInfo fieldInfo) {
  31. Class<?> clazz = beanInfo.clazz;
  32. Class<?> fieldClass = fieldInfo.fieldClass;
  33. Class<?> deserializeUsing = null;
  34. JSONField annotation = fieldInfo.getAnnotation();
  35. if (annotation != null) {
  36. deserializeUsing = annotation.deserializeUsing();
  37. if (deserializeUsing == Void.class) {
  38. deserializeUsing = null;
  39. }
  40. }
  41. if (deserializeUsing == null && (fieldClass == List.class || fieldClass == ArrayList.class)) {
  42. return new ArrayListTypeFieldDeserializer(mapping, clazz, fieldInfo);
  43. }
  44. return new DefaultFieldDeserializerBug569(mapping, clazz, fieldInfo);
  45. }
  46. public ObjectDeserializer getDeserializer(Class<?> clazz, Type type) {
  47. com.alibaba.fastjson.util.IdentityHashMap<Type, ObjectDeserializer> deserializers = super.getDeserializers();
  48. ObjectDeserializer deserializer = deserializers.get(type);
  49. if (deserializer != null) {
  50. return deserializer;
  51. }
  52. if (type == null) {
  53. type = clazz;
  54. }
  55. deserializer = deserializers.get(type);
  56. if (deserializer != null) {
  57. return deserializer;
  58. }
  59. {
  60. JSONType annotation = TypeUtils.getAnnotation(clazz,JSONType.class);
  61. if (annotation != null) {
  62. Class<?> mappingTo = annotation.mappingTo();
  63. if (mappingTo != Void.class) {
  64. return getDeserializer(mappingTo, mappingTo);
  65. }
  66. }
  67. }
  68. if (type instanceof WildcardType || type instanceof TypeVariable || type instanceof ParameterizedType) {
  69. deserializer = deserializers.get(clazz);
  70. }
  71. if (deserializer != null) {
  72. return deserializer;
  73. }
  74. String className = clazz.getName();
  75. className = className.replace('$', '.');
  76. for (int i = 0; i < denyList.length; ++i) {
  77. String deny = denyList[i];
  78. if (className.startsWith(deny)) {
  79. throw new JSONException("parser deny : " + className);
  80. }
  81. }
  82. if (className.startsWith("java.awt.") //
  83. && AwtCodec.support(clazz)) {
  84. if (!awtError) {
  85. try {
  86. deserializers.put(Class.forName("java.awt.Point"), AwtCodec.instance);
  87. deserializers.put(Class.forName("java.awt.Font"), AwtCodec.instance);
  88. deserializers.put(Class.forName("java.awt.Rectangle"), AwtCodec.instance);
  89. deserializers.put(Class.forName("java.awt.Color"), AwtCodec.instance);
  90. } catch (Throwable e) {
  91. // skip
  92. awtError = true;
  93. }
  94. deserializer = AwtCodec.instance;
  95. }
  96. }
  97. if (!jdk8Error) {
  98. try {
  99. if (className.startsWith("java.time.")) {
  100. deserializers.put(Class.forName("java.time.LocalDateTime"), Jdk8DateCodec.instance);
  101. deserializers.put(Class.forName("java.time.LocalDate"), Jdk8DateCodec.instance);
  102. deserializers.put(Class.forName("java.time.LocalTime"), Jdk8DateCodec.instance);
  103. deserializers.put(Class.forName("java.time.ZonedDateTime"), Jdk8DateCodec.instance);
  104. deserializers.put(Class.forName("java.time.OffsetDateTime"), Jdk8DateCodec.instance);
  105. deserializers.put(Class.forName("java.time.OffsetTime"), Jdk8DateCodec.instance);
  106. deserializers.put(Class.forName("java.time.ZoneOffset"), Jdk8DateCodec.instance);
  107. deserializers.put(Class.forName("java.time.ZoneRegion"), Jdk8DateCodec.instance);
  108. deserializers.put(Class.forName("java.time.ZoneId"), Jdk8DateCodec.instance);
  109. deserializers.put(Class.forName("java.time.Period"), Jdk8DateCodec.instance);
  110. deserializers.put(Class.forName("java.time.Duration"), Jdk8DateCodec.instance);
  111. deserializers.put(Class.forName("java.time.Instant"), Jdk8DateCodec.instance);
  112. deserializer = deserializers.get(clazz);
  113. } else if (className.startsWith("java.util.Optional")) {
  114. deserializers.put(Class.forName("java.util.Optional"), OptionalCodec.instance);
  115. deserializers.put(Class.forName("java.util.OptionalDouble"), OptionalCodec.instance);
  116. deserializers.put(Class.forName("java.util.OptionalInt"), OptionalCodec.instance);
  117. deserializers.put(Class.forName("java.util.OptionalLong"), OptionalCodec.instance);
  118. deserializer = deserializers.get(clazz);
  119. }
  120. } catch (Throwable e) {
  121. // skip
  122. jdk8Error = true;
  123. }
  124. }
  125. if (className.equals("java.nio.file.Path")) {
  126. deserializers.put(clazz, MiscCodec.instance);
  127. }
  128. final ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
  129. try {
  130. for (AutowiredObjectDeserializer autowired : ServiceLoader.load(AutowiredObjectDeserializer.class,
  131. classLoader)) {
  132. for (Type forType : autowired.getAutowiredFor()) {
  133. deserializers.put(forType, autowired);
  134. }
  135. }
  136. } catch (Exception ex) {
  137. // skip
  138. }
  139. if (deserializer == null) {
  140. deserializer = deserializers.get(type);
  141. }
  142. if (deserializer != null) {
  143. return deserializer;
  144. }
  145. if (clazz.isEnum()) {
  146. deserializer = new EnumDeserializer(clazz);
  147. } else if (clazz.isArray()) {
  148. deserializer = ObjectArrayCodec.instance;
  149. } else if (clazz == Set.class || clazz == HashSet.class || clazz == Collection.class || clazz == List.class
  150. || clazz == ArrayList.class) {
  151. deserializer = CollectionCodec.instance;
  152. } else if (Collection.class.isAssignableFrom(clazz)) {
  153. deserializer = CollectionCodec.instance;
  154. } else if (Map.class.isAssignableFrom(clazz)) {
  155. deserializer = MapDeserializer.instance;
  156. } else if (Throwable.class.isAssignableFrom(clazz)) {
  157. deserializer = new ThrowableDeserializer(this, clazz);
  158. } else {
  159. deserializer = createJavaBeanDeserializer(clazz, type);
  160. }
  161. putDeserializer(type, deserializer);
  162. return deserializer;
  163. }
  164. }