/src/main/java/com/alibaba/fastjson/parser/deserializer/DefaultFieldDeserializer.java

https://github.com/alibaba/fastjson · Java · 142 lines · 124 code · 17 blank · 1 comment · 45 complexity · 836e5d56367ba048a59a7a4688fd6545 MD5 · raw file

  1. package com.alibaba.fastjson.parser.deserializer;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.lang.reflect.ParameterizedType;
  6. import java.lang.reflect.Type;
  7. import java.util.Map;
  8. import java.util.zip.GZIPInputStream;
  9. import com.alibaba.fastjson.JSONException;
  10. import com.alibaba.fastjson.annotation.JSONField;
  11. import com.alibaba.fastjson.parser.DefaultJSONParser;
  12. import com.alibaba.fastjson.parser.DefaultJSONParser.ResolveTask;
  13. import com.alibaba.fastjson.parser.JSONToken;
  14. import com.alibaba.fastjson.parser.ParseContext;
  15. import com.alibaba.fastjson.parser.ParserConfig;
  16. import com.alibaba.fastjson.util.FieldInfo;
  17. public class DefaultFieldDeserializer extends FieldDeserializer {
  18. protected ObjectDeserializer fieldValueDeserilizer;
  19. protected boolean customDeserilizer = false;
  20. public DefaultFieldDeserializer(ParserConfig config, Class<?> clazz, FieldInfo fieldInfo){
  21. super(clazz, fieldInfo);
  22. JSONField annotation = fieldInfo.getAnnotation();
  23. if (annotation != null) {
  24. Class<?> deserializeUsing = annotation.deserializeUsing();
  25. customDeserilizer = deserializeUsing != null && deserializeUsing != Void.class;
  26. }
  27. }
  28. public ObjectDeserializer getFieldValueDeserilizer(ParserConfig config) {
  29. if (fieldValueDeserilizer == null) {
  30. JSONField annotation = fieldInfo.getAnnotation();
  31. if (annotation != null && annotation.deserializeUsing() != Void.class) {
  32. Class<?> deserializeUsing = annotation.deserializeUsing();
  33. try {
  34. fieldValueDeserilizer = (ObjectDeserializer) deserializeUsing.newInstance();
  35. } catch (Exception ex) {
  36. throw new JSONException("create deserializeUsing ObjectDeserializer error", ex);
  37. }
  38. } else {
  39. fieldValueDeserilizer = config.getDeserializer(fieldInfo.fieldClass, fieldInfo.fieldType);
  40. }
  41. }
  42. return fieldValueDeserilizer;
  43. }
  44. @Override
  45. public void parseField(DefaultJSONParser parser, Object object, Type objectType, Map<String, Object> fieldValues) {
  46. if (this.fieldValueDeserilizer == null) {
  47. getFieldValueDeserilizer(parser.getConfig());
  48. }
  49. ObjectDeserializer fieldValueDeserilizer = this.fieldValueDeserilizer;
  50. Type fieldType = fieldInfo.fieldType;
  51. if (objectType instanceof ParameterizedType) {
  52. ParseContext objContext = parser.getContext();
  53. if (objContext != null) {
  54. objContext.type = objectType;
  55. }
  56. if (fieldType != objectType) {
  57. fieldType = FieldInfo.getFieldType(this.clazz, objectType, fieldType);
  58. if (fieldValueDeserilizer instanceof JavaObjectDeserializer) {
  59. fieldValueDeserilizer = parser.getConfig().getDeserializer(fieldType);
  60. }
  61. }
  62. }
  63. // ContextObjectDeserializer
  64. Object value;
  65. if (fieldValueDeserilizer instanceof JavaBeanDeserializer && fieldInfo.parserFeatures != 0) {
  66. JavaBeanDeserializer javaBeanDeser = (JavaBeanDeserializer) fieldValueDeserilizer;
  67. value = javaBeanDeser.deserialze(parser, fieldType, fieldInfo.name, fieldInfo.parserFeatures);
  68. } else {
  69. if ((this.fieldInfo.format != null || this.fieldInfo.parserFeatures != 0)
  70. && fieldValueDeserilizer instanceof ContextObjectDeserializer) {
  71. value = ((ContextObjectDeserializer) fieldValueDeserilizer) //
  72. .deserialze(parser,
  73. fieldType,
  74. fieldInfo.name,
  75. fieldInfo.format,
  76. fieldInfo.parserFeatures);
  77. } else {
  78. value = fieldValueDeserilizer.deserialze(parser, fieldType, fieldInfo.name);
  79. }
  80. }
  81. if (value instanceof byte[]
  82. && ("gzip".equals(fieldInfo.format) || "gzip,base64".equals(fieldInfo.format))) {
  83. byte[] bytes = (byte[]) value;
  84. GZIPInputStream gzipIn = null;
  85. try {
  86. gzipIn = new GZIPInputStream(new ByteArrayInputStream(bytes));
  87. ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
  88. for (;;) {
  89. byte[] buf = new byte[1024];
  90. int len = gzipIn.read(buf);
  91. if (len == -1) {
  92. break;
  93. }
  94. if (len > 0) {
  95. byteOut.write(buf, 0, len);
  96. }
  97. }
  98. value = byteOut.toByteArray();
  99. } catch (IOException ex) {
  100. throw new JSONException("unzip bytes error.", ex);
  101. }
  102. }
  103. if (parser.getResolveStatus() == DefaultJSONParser.NeedToResolve) {
  104. ResolveTask task = parser.getLastResolveTask();
  105. task.fieldDeserializer = this;
  106. task.ownerContext = parser.getContext();
  107. parser.setResolveStatus(DefaultJSONParser.NONE);
  108. } else {
  109. if (object == null) {
  110. fieldValues.put(fieldInfo.name, value);
  111. } else {
  112. setValue(object, value);
  113. }
  114. }
  115. }
  116. public int getFastMatchToken() {
  117. if (fieldValueDeserilizer != null) {
  118. return fieldValueDeserilizer.getFastMatchToken();
  119. }
  120. return JSONToken.LITERAL_INT;
  121. }
  122. public void parseFieldUnwrapped(DefaultJSONParser parser, Object object, Type objectType, Map<String, Object> fieldValues) {
  123. throw new JSONException("TODO");
  124. }
  125. }