/src/main/java/com/alibaba/fastjson/serializer/ListSerializer.java

https://github.com/alibaba/fastjson · Java · 148 lines · 109 code · 21 blank · 18 comment · 38 complexity · 9e214de0a4ed6c20b4babcaad5ea07ec MD5 · raw file

  1. /*
  2. * Copyright 1999-2018 Alibaba Group.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package com.alibaba.fastjson.serializer;
  17. import com.alibaba.fastjson.util.TypeUtils;
  18. import java.io.IOException;
  19. import java.lang.reflect.Type;
  20. import java.util.List;
  21. /**
  22. * @author wenshao[szujobs@hotmail.com]
  23. */
  24. public final class ListSerializer implements ObjectSerializer {
  25. public static final ListSerializer instance = new ListSerializer();
  26. public final void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features)
  27. throws IOException {
  28. boolean writeClassName = serializer.out.isEnabled(SerializerFeature.WriteClassName)
  29. || SerializerFeature.isEnabled(features, SerializerFeature.WriteClassName);
  30. SerializeWriter out = serializer.out;
  31. Type elementType = null;
  32. if (writeClassName) {
  33. elementType = TypeUtils.getCollectionItemType(fieldType);
  34. }
  35. if (object == null) {
  36. out.writeNull(SerializerFeature.WriteNullListAsEmpty);
  37. return;
  38. }
  39. List<?> list = (List<?>) object;
  40. if (list.size() == 0) {
  41. out.append("[]");
  42. return;
  43. }
  44. SerialContext context = serializer.context;
  45. serializer.setContext(context, object, fieldName, 0);
  46. ObjectSerializer itemSerializer = null;
  47. try {
  48. if (out.isEnabled(SerializerFeature.PrettyFormat)) {
  49. out.append('[');
  50. serializer.incrementIndent();
  51. int i = 0;
  52. for (Object item : list) {
  53. if (i != 0) {
  54. out.append(',');
  55. }
  56. serializer.println();
  57. if (item != null) {
  58. if (serializer.containsReference(item)) {
  59. serializer.writeReference(item);
  60. } else {
  61. itemSerializer = serializer.getObjectWriter(item.getClass());
  62. SerialContext itemContext = new SerialContext(context, object, fieldName, 0, 0);
  63. serializer.context = itemContext;
  64. itemSerializer.write(serializer, item, i, elementType, features);
  65. }
  66. } else {
  67. serializer.out.writeNull();
  68. }
  69. i++;
  70. }
  71. serializer.decrementIdent();
  72. serializer.println();
  73. out.append(']');
  74. return;
  75. }
  76. out.append('[');
  77. for (int i = 0, size = list.size(); i < size; ++i) {
  78. Object item = list.get(i);
  79. if (i != 0) {
  80. out.append(',');
  81. }
  82. if (item == null) {
  83. out.append("null");
  84. } else {
  85. Class<?> clazz = item.getClass();
  86. if (clazz == Integer.class) {
  87. out.writeInt(((Integer) item).intValue());
  88. } else if (clazz == Long.class) {
  89. long val = ((Long) item).longValue();
  90. if (writeClassName) {
  91. out.writeLong(val);
  92. out.write('L');
  93. } else {
  94. out.writeLong(val);
  95. }
  96. } else {
  97. if ((SerializerFeature.DisableCircularReferenceDetect.mask & features) != 0){
  98. itemSerializer = serializer.getObjectWriter(item.getClass());
  99. itemSerializer.write(serializer, item, i, elementType, features);
  100. }else {
  101. if (!out.disableCircularReferenceDetect) {
  102. SerialContext itemContext = new SerialContext(context, object, fieldName, 0, 0);
  103. serializer.context = itemContext;
  104. }
  105. if (serializer.containsReference(item)) {
  106. serializer.writeReference(item);
  107. } else {
  108. itemSerializer = serializer.getObjectWriter(item.getClass());
  109. if ((SerializerFeature.WriteClassName.mask & features) != 0
  110. && itemSerializer instanceof JavaBeanSerializer)
  111. {
  112. JavaBeanSerializer javaBeanSerializer = (JavaBeanSerializer) itemSerializer;
  113. javaBeanSerializer.writeNoneASM(serializer, item, i, elementType, features);
  114. } else {
  115. itemSerializer.write(serializer, item, i, elementType, features);
  116. }
  117. }
  118. }
  119. }
  120. }
  121. }
  122. out.append(']');
  123. } finally {
  124. serializer.context = context;
  125. }
  126. }
  127. }