package com.alibaba.fastjson.parser.deserializer; import java.io.IOException; import java.lang.reflect.Type; import java.util.Optional; import java.util.OptionalDouble; import java.util.OptionalInt; import java.util.OptionalLong; import com.alibaba.fastjson.JSONException; import com.alibaba.fastjson.parser.DefaultJSONParser; import com.alibaba.fastjson.parser.JSONToken; import com.alibaba.fastjson.serializer.JSONSerializer; import com.alibaba.fastjson.serializer.ObjectSerializer; import com.alibaba.fastjson.util.TypeUtils; public class OptionalCodec implements ObjectSerializer, ObjectDeserializer { public static OptionalCodec instance = new OptionalCodec(); @SuppressWarnings("unchecked") public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) { if (type == OptionalInt.class) { Object obj = parser.parseObject(Integer.class); Integer value = TypeUtils.castToInt(obj); if (value == null) { return (T) OptionalInt.empty(); } else { return (T) OptionalInt.of(value); } } if (type == OptionalLong.class) { Object obj = parser.parseObject(Long.class); Long value = TypeUtils.castToLong(obj); if (value == null) { return (T) OptionalLong.empty(); } else { return (T) OptionalLong.of(value); } } if (type == OptionalDouble.class) { Object obj = parser.parseObject(Double.class); Double value = TypeUtils.castToDouble(obj); if (value == null) { return (T) OptionalDouble.empty(); } else { return (T) OptionalDouble.of(value); } } type = TypeUtils.unwrapOptional(type); Object value = parser.parseObject(type); if (value == null) { return (T) Optional.empty(); } return (T) Optional.of(value); } public int getFastMatchToken() { return JSONToken.LBRACE; } public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException { if (object == null) { serializer.writeNull(); return; } if (object instanceof Optional) { Optional<?> optional = (Optional<?>) object; Object value = optional.isPresent() ? optional.get() : null; serializer.write(value); return; } if (object instanceof OptionalDouble) { OptionalDouble optional = (OptionalDouble) object; if (optional.isPresent()) { double value = optional.getAsDouble(); serializer.write(value); } else { serializer.writeNull(); } return; } if (object instanceof OptionalInt) { OptionalInt optional = (OptionalInt) object; if (optional.isPresent()) { int value = optional.getAsInt(); serializer.out.writeInt(value); } else { serializer.writeNull(); } return; } if (object instanceof OptionalLong) { OptionalLong optional = (OptionalLong) object; if (optional.isPresent()) { long value = optional.getAsLong(); serializer.out.writeLong(value); } else { serializer.writeNull(); } return; } throw new JSONException("not support optional : " + object.getClass()); } }