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

https://github.com/alibaba/fastjson · Java · 271 lines · 214 code · 52 blank · 5 comment · 81 complexity · 71594d44102559cbace946f979fc2292 MD5 · raw file

  1. package com.alibaba.fastjson.serializer;
  2. import java.text.DecimalFormat;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import com.alibaba.fastjson.JSON;
  6. public abstract class SerializeFilterable {
  7. protected List<BeforeFilter> beforeFilters = null;
  8. protected List<AfterFilter> afterFilters = null;
  9. protected List<PropertyFilter> propertyFilters = null;
  10. protected List<ValueFilter> valueFilters = null;
  11. protected List<NameFilter> nameFilters = null;
  12. protected List<PropertyPreFilter> propertyPreFilters = null;
  13. protected List<LabelFilter> labelFilters = null;
  14. protected List<ContextValueFilter> contextValueFilters = null;
  15. protected boolean writeDirect = true;
  16. public List<BeforeFilter> getBeforeFilters() {
  17. if (beforeFilters == null) {
  18. beforeFilters = new ArrayList<BeforeFilter>();
  19. writeDirect = false;
  20. }
  21. return beforeFilters;
  22. }
  23. public List<AfterFilter> getAfterFilters() {
  24. if (afterFilters == null) {
  25. afterFilters = new ArrayList<AfterFilter>();
  26. writeDirect = false;
  27. }
  28. return afterFilters;
  29. }
  30. public List<NameFilter> getNameFilters() {
  31. if (nameFilters == null) {
  32. nameFilters = new ArrayList<NameFilter>();
  33. writeDirect = false;
  34. }
  35. return nameFilters;
  36. }
  37. public List<PropertyPreFilter> getPropertyPreFilters() {
  38. if (propertyPreFilters == null) {
  39. propertyPreFilters = new ArrayList<PropertyPreFilter>();
  40. writeDirect = false;
  41. }
  42. return propertyPreFilters;
  43. }
  44. public List<LabelFilter> getLabelFilters() {
  45. if (labelFilters == null) {
  46. labelFilters = new ArrayList<LabelFilter>();
  47. writeDirect = false;
  48. }
  49. return labelFilters;
  50. }
  51. public List<PropertyFilter> getPropertyFilters() {
  52. if (propertyFilters == null) {
  53. propertyFilters = new ArrayList<PropertyFilter>();
  54. writeDirect = false;
  55. }
  56. return propertyFilters;
  57. }
  58. public List<ContextValueFilter> getContextValueFilters() {
  59. if (contextValueFilters == null) {
  60. contextValueFilters = new ArrayList<ContextValueFilter>();
  61. writeDirect = false;
  62. }
  63. return contextValueFilters;
  64. }
  65. public List<ValueFilter> getValueFilters() {
  66. if (valueFilters == null) {
  67. valueFilters = new ArrayList<ValueFilter>();
  68. writeDirect = false;
  69. }
  70. return valueFilters;
  71. }
  72. public void addFilter(SerializeFilter filter) {
  73. if (filter == null) {
  74. return;
  75. }
  76. if (filter instanceof PropertyPreFilter) {
  77. this.getPropertyPreFilters().add((PropertyPreFilter) filter);
  78. }
  79. if (filter instanceof NameFilter) {
  80. this.getNameFilters().add((NameFilter) filter);
  81. }
  82. if (filter instanceof ValueFilter) {
  83. this.getValueFilters().add((ValueFilter) filter);
  84. }
  85. if (filter instanceof ContextValueFilter) {
  86. this.getContextValueFilters().add((ContextValueFilter) filter);
  87. }
  88. if (filter instanceof PropertyFilter) {
  89. this.getPropertyFilters().add((PropertyFilter) filter);
  90. }
  91. if (filter instanceof BeforeFilter) {
  92. this.getBeforeFilters().add((BeforeFilter) filter);
  93. }
  94. if (filter instanceof AfterFilter) {
  95. this.getAfterFilters().add((AfterFilter) filter);
  96. }
  97. if (filter instanceof LabelFilter) {
  98. this.getLabelFilters().add((LabelFilter) filter);
  99. }
  100. }
  101. public boolean applyName(JSONSerializer jsonBeanDeser, //
  102. Object object, String key) {
  103. if (jsonBeanDeser.propertyPreFilters != null) {
  104. for (PropertyPreFilter filter : jsonBeanDeser.propertyPreFilters) {
  105. if (!filter.apply(jsonBeanDeser, object, key)) {
  106. return false;
  107. }
  108. }
  109. }
  110. if (this.propertyPreFilters != null) {
  111. for (PropertyPreFilter filter : this.propertyPreFilters) {
  112. if (!filter.apply(jsonBeanDeser, object, key)) {
  113. return false;
  114. }
  115. }
  116. }
  117. return true;
  118. }
  119. public boolean apply(JSONSerializer jsonBeanDeser, //
  120. Object object, //
  121. String key, Object propertyValue) {
  122. if (jsonBeanDeser.propertyFilters != null) {
  123. for (PropertyFilter propertyFilter : jsonBeanDeser.propertyFilters) {
  124. if (!propertyFilter.apply(object, key, propertyValue)) {
  125. return false;
  126. }
  127. }
  128. }
  129. if (this.propertyFilters != null) {
  130. for (PropertyFilter propertyFilter : this.propertyFilters) {
  131. if (!propertyFilter.apply(object, key, propertyValue)) {
  132. return false;
  133. }
  134. }
  135. }
  136. return true;
  137. }
  138. protected String processKey(JSONSerializer jsonBeanDeser, //
  139. Object object, //
  140. String key, //
  141. Object propertyValue) {
  142. if (jsonBeanDeser.nameFilters != null) {
  143. for (NameFilter nameFilter : jsonBeanDeser.nameFilters) {
  144. key = nameFilter.process(object, key, propertyValue);
  145. }
  146. }
  147. if (this.nameFilters != null) {
  148. for (NameFilter nameFilter : this.nameFilters) {
  149. key = nameFilter.process(object, key, propertyValue);
  150. }
  151. }
  152. return key;
  153. }
  154. protected Object processValue(JSONSerializer jsonBeanDeser, //
  155. BeanContext beanContext,
  156. Object object, //
  157. String key, //
  158. Object propertyValue) {
  159. return processValue(jsonBeanDeser, beanContext, object, key, propertyValue, 0);
  160. }
  161. protected Object processValue(JSONSerializer jsonBeanDeser, //
  162. BeanContext beanContext,
  163. Object object, //
  164. String key, //
  165. Object propertyValue, //
  166. int features) {
  167. if (propertyValue != null) {
  168. if ((SerializerFeature.isEnabled(jsonBeanDeser.out.features, features, SerializerFeature.WriteNonStringValueAsString) //
  169. || (beanContext != null && (beanContext.getFeatures() & SerializerFeature.WriteNonStringValueAsString.mask) != 0))
  170. && (propertyValue instanceof Number || propertyValue instanceof Boolean)) {
  171. String format = null;
  172. if (propertyValue instanceof Number
  173. && beanContext != null) {
  174. format = beanContext.getFormat();
  175. }
  176. if (format != null) {
  177. propertyValue = new DecimalFormat(format).format(propertyValue);
  178. } else {
  179. propertyValue = propertyValue.toString();
  180. }
  181. } else if (beanContext != null && beanContext.isJsonDirect()) {
  182. String jsonStr = (String) propertyValue;
  183. propertyValue = JSON.parse(jsonStr);
  184. }
  185. }
  186. if (jsonBeanDeser.valueFilters != null) {
  187. for (ValueFilter valueFilter : jsonBeanDeser.valueFilters) {
  188. propertyValue = valueFilter.process(object, key, propertyValue);
  189. }
  190. }
  191. List<ValueFilter> valueFilters = this.valueFilters;
  192. if (valueFilters != null) {
  193. for (ValueFilter valueFilter : valueFilters) {
  194. propertyValue = valueFilter.process(object, key, propertyValue);
  195. }
  196. }
  197. if (jsonBeanDeser.contextValueFilters != null) {
  198. for (ContextValueFilter valueFilter : jsonBeanDeser.contextValueFilters) {
  199. propertyValue = valueFilter.process(beanContext, object, key, propertyValue);
  200. }
  201. }
  202. if (this.contextValueFilters != null) {
  203. for (ContextValueFilter valueFilter : this.contextValueFilters) {
  204. propertyValue = valueFilter.process(beanContext, object, key, propertyValue);
  205. }
  206. }
  207. return propertyValue;
  208. }
  209. /**
  210. * only invoke by asm byte
  211. *
  212. * @return
  213. */
  214. protected boolean writeDirect(JSONSerializer jsonBeanDeser) {
  215. return jsonBeanDeser.out.writeDirect //
  216. && this.writeDirect //
  217. && jsonBeanDeser.writeDirect;
  218. }
  219. }