/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
- 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());
- }
- }