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

https://github.com/alibaba/fastjson · Java · 119 lines · 99 code · 20 blank · 0 comment · 29 complexity · 021bb65c99d12df6db31bb54f1481272 MD5 · raw file

  1. package com.alibaba.fastjson.parser.deserializer;
  2. import java.io.IOException;
  3. import java.lang.reflect.Type;
  4. import java.util.Optional;
  5. import java.util.OptionalDouble;
  6. import java.util.OptionalInt;
  7. import java.util.OptionalLong;
  8. import com.alibaba.fastjson.JSONException;
  9. import com.alibaba.fastjson.parser.DefaultJSONParser;
  10. import com.alibaba.fastjson.parser.JSONToken;
  11. import com.alibaba.fastjson.serializer.JSONSerializer;
  12. import com.alibaba.fastjson.serializer.ObjectSerializer;
  13. import com.alibaba.fastjson.util.TypeUtils;
  14. public class OptionalCodec implements ObjectSerializer, ObjectDeserializer {
  15. public static OptionalCodec instance = new OptionalCodec();
  16. @SuppressWarnings("unchecked")
  17. public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
  18. if (type == OptionalInt.class) {
  19. Object obj = parser.parseObject(Integer.class);
  20. Integer value = TypeUtils.castToInt(obj);
  21. if (value == null) {
  22. return (T) OptionalInt.empty();
  23. } else {
  24. return (T) OptionalInt.of(value);
  25. }
  26. }
  27. if (type == OptionalLong.class) {
  28. Object obj = parser.parseObject(Long.class);
  29. Long value = TypeUtils.castToLong(obj);
  30. if (value == null) {
  31. return (T) OptionalLong.empty();
  32. } else {
  33. return (T) OptionalLong.of(value);
  34. }
  35. }
  36. if (type == OptionalDouble.class) {
  37. Object obj = parser.parseObject(Double.class);
  38. Double value = TypeUtils.castToDouble(obj);
  39. if (value == null) {
  40. return (T) OptionalDouble.empty();
  41. } else {
  42. return (T) OptionalDouble.of(value);
  43. }
  44. }
  45. type = TypeUtils.unwrapOptional(type);
  46. Object value = parser.parseObject(type);
  47. if (value == null) {
  48. return (T) Optional.empty();
  49. }
  50. return (T) Optional.of(value);
  51. }
  52. public int getFastMatchToken() {
  53. return JSONToken.LBRACE;
  54. }
  55. public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType,
  56. int features) throws IOException {
  57. if (object == null) {
  58. serializer.writeNull();
  59. return;
  60. }
  61. if (object instanceof Optional) {
  62. Optional<?> optional = (Optional<?>) object;
  63. Object value = optional.isPresent() ? optional.get() : null;
  64. serializer.write(value);
  65. return;
  66. }
  67. if (object instanceof OptionalDouble) {
  68. OptionalDouble optional = (OptionalDouble) object;
  69. if (optional.isPresent()) {
  70. double value = optional.getAsDouble();
  71. serializer.write(value);
  72. } else {
  73. serializer.writeNull();
  74. }
  75. return;
  76. }
  77. if (object instanceof OptionalInt) {
  78. OptionalInt optional = (OptionalInt) object;
  79. if (optional.isPresent()) {
  80. int value = optional.getAsInt();
  81. serializer.out.writeInt(value);
  82. } else {
  83. serializer.writeNull();
  84. }
  85. return;
  86. }
  87. if (object instanceof OptionalLong) {
  88. OptionalLong optional = (OptionalLong) object;
  89. if (optional.isPresent()) {
  90. long value = optional.getAsLong();
  91. serializer.out.writeLong(value);
  92. } else {
  93. serializer.writeNull();
  94. }
  95. return;
  96. }
  97. throw new JSONException("not support optional : " + object.getClass());
  98. }
  99. }