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

https://github.com/alibaba/fastjson · Java · 67 lines · 55 code · 7 blank · 5 comment · 15 complexity · 0835563d229c0a8377d3b65d5e6a13f9 MD5 · raw file

  1. package com.alibaba.fastjson.deserializer.issues569.parser;
  2. import com.alibaba.fastjson.parser.DefaultJSONParser;
  3. import com.alibaba.fastjson.parser.ParseContext;
  4. import com.alibaba.fastjson.parser.ParserConfig;
  5. import com.alibaba.fastjson.parser.deserializer.ContextObjectDeserializer;
  6. import com.alibaba.fastjson.parser.deserializer.DefaultFieldDeserializer;
  7. import com.alibaba.fastjson.parser.deserializer.JavaBeanDeserializer;
  8. import com.alibaba.fastjson.util.FieldInfo;
  9. import java.lang.reflect.ParameterizedType;
  10. import java.lang.reflect.Type;
  11. import java.util.Map;
  12. /**
  13. * Author : BlackShadowWalker
  14. * Date : 2016-10-10
  15. */
  16. public class DefaultFieldDeserializerBug569 extends DefaultFieldDeserializer {
  17. public DefaultFieldDeserializerBug569(ParserConfig mapping, Class<?> clazz, FieldInfo fieldInfo) {
  18. super(mapping, clazz, fieldInfo);
  19. }
  20. @Override
  21. public void parseField(DefaultJSONParser parser, Object object, Type objectType, Map<String, Object> fieldValues) {
  22. if (fieldValueDeserilizer == null) {
  23. getFieldValueDeserilizer(parser.getConfig());
  24. }
  25. Type fieldType = fieldInfo.fieldType;
  26. if (objectType instanceof ParameterizedType) {
  27. ParseContext objContext = parser.getContext();
  28. objContext.type = objectType;
  29. fieldType = FieldInfo.getFieldType(this.clazz, objectType, fieldType);
  30. }
  31. // ContextObjectDeserializer
  32. Object value;
  33. if (fieldValueDeserilizer instanceof JavaBeanDeserializer) {
  34. JavaBeanDeserializer javaBeanDeser = (JavaBeanDeserializer) fieldValueDeserilizer;
  35. value = javaBeanDeser.deserialze(parser, fieldType, fieldInfo.name, fieldInfo.parserFeatures);
  36. } else {
  37. if (this.fieldInfo.format != null && fieldValueDeserilizer instanceof ContextObjectDeserializer) {
  38. value = ((ContextObjectDeserializer) fieldValueDeserilizer) //
  39. .deserialze(parser, fieldType,
  40. fieldInfo.name,
  41. fieldInfo.format,
  42. fieldInfo.parserFeatures);
  43. } else {
  44. value = fieldValueDeserilizer.deserialze(parser, fieldType, fieldInfo.name);
  45. }
  46. }
  47. if (parser.getResolveStatus() == DefaultJSONParser.NeedToResolve) {
  48. DefaultJSONParser.ResolveTask task = parser.getLastResolveTask();
  49. task.fieldDeserializer = this;
  50. task.ownerContext = parser.getContext();
  51. parser.setResolveStatus(DefaultJSONParser.NONE);
  52. } else {
  53. if (object == null) {
  54. fieldValues.put(fieldInfo.name, value);
  55. } else {
  56. setValue(object, value);
  57. }
  58. }
  59. }
  60. }