Android FastJson类型自适应机制的设计思路与实现
一、类型自适应机制概述
在Android开发中,JSON数据与Java对象的转换是常见需求。FastJson的类型自适应机制允许开发者在不进行复杂配置的情况下,将JSON数据自动映射到对应的Java类型。该机制通过动态识别JSON数据结构,并匹配目标Java类型,实现从基础数据类型到复杂自定义类、集合、Map等类型的自动转换。其核心设计思路围绕类型识别、动态匹配、泛型解析和反射操作展开,接下来将从源码层面深入解析其实现原理。
二、类型自适应的基础设计原则
2.1 动态类型识别
FastJson的类型自适应基于动态类型识别机制。在反序列化过程中,JSONParser
类负责将JSON字符串解析为Token流,并根据Token类型判断数据结构。例如,当遇到{
时,判断为JSON对象;遇到[
时,判断为JSON数组。
public Object parse() {JSONLexer lexer = this.lexer;switch (lexer.token()) {case JSONToken.NULL:lexer.nextToken();return null;case JSONToken.LITERAL_STRING:String text = lexer.stringVal();lexer.nextToken();return text;case JSONToken.BEGIN_ARRAY:return parseArray();case JSONToken.BEGIN_OBJECT:return parseObject();// 省略其他Token处理逻辑default:throw new JSONException("syntax error");}
}
上述代码展示了JSONParser
根据Token类型调用不同解析方法的逻辑,实现动态类型识别。
2.2 目标类型兼容性判断
在反序列化前,FastJson会检查目标Java类型与JSON数据的兼容性。例如,对于数值类型,会判断是否可转换为对应的Java基本类型或包装类型。
public static Object cast(Object value, Type type, Object fieldNameContext) {if (type == int.class || type == Integer.class) {if (value instanceof Number) {return ((Number) value).intValue();}return Integer.parseInt(value.toString());}// 其他类型处理逻辑
}
该方法通过TypeUtils.cast
实现类型转换,在转换前会进行兼容性判断,确保类型自适应的准确性。
三、类型识别与解析过程
3.1 JSON数据解析
FastJson通过JSONLexer
类将JSON字符串解析为Token流。每个Token代表JSON数据中的一个基本单元,如对象开始、对象结束、字符串、数字等。
public Token nextToken() {skipWhitespace();char c = current();if (c == 0) {return Token.END;}switch (c) {case '{':pos++;return Token.BEGIN_OBJECT;case '}':pos++;return Token.END_OBJECT;case '[':pos++;return Token.BEGIN_ARRAY;case ']':pos++;return Token.END_ARRAY;case '"':return readString();case ',':pos++;return Token.COMMA;case ':':pos++;return Token.COLON;case '-':case '0': case '1': case '2': case '3': case '4':case '5': case '6': case '7': case '8': case '9':return readNumber();case 't': case 'f':return readBoolean();case 'n':return readNull();default:throw new JSONException("syntax error");}
}
nextToken
方法通过字符匹配识别不同类型的Token,为后续的类型自适应提供基础数据。
3.2 Java类型解析
对于目标Java类型,FastJson利用Java反射机制获取类型信息。通过Type
接口及其实现类(如Class
、ParameterizedType
),可以获取类的结构、属性、泛型参数等信息。
public Object parseObject(Type clazz, Object fieldNameContext) {if (clazz == null || clazz == Object.class) {return parse();}if (clazz instanceof Class) {Class<?> rawClass = (Class<?>) clazz;if (rawClass.isArray()) {return parseArray(clazz, fieldNameContext);}if (Collection.class.isAssignableFrom(rawClass)) {return parseArray(clazz, fieldNameContext);}if (Map.class.isAssignableFrom(rawClass)) {return parseMap(clazz, fieldNameContext);}// 处理普通JavaBeantry {Object object = createJavaBean(clazz);parseObject(object, clazz, fieldNameContext);return object;} catch (Exception e) {throw new JSONException("create instance error", e);}}return null;
}
上述代码根据目标类型调用不同的解析方法,实现Java类型的动态处理。
四、基本类型的自适应转换
4.1 数值类型转换
FastJson在TypeUtils.cast
方法中实现了数值类型的自适应转换。当JSON数据为字符串时,会尝试将其转换为对应的Java数值类型。
public static Object cast(Object value, Type type, Object fieldNameContext) {if (type == int.class || type == Integer.class) {if (value instanceof Number) {return ((Number) value).intValue();}try {return Integer.parseInt(value.toString());} catch (NumberFormatException e) {throw new JSONException("parse int error", e);}}if (type == long.class || type == Long.class) {if (value instanceof Number) {return ((Number) value).longValue();}try {return Long.parseLong(value.toString());} catch (NumberFormatException e) {throw new JSONException("parse long error", e);}}// 其他数值类型处理逻辑
}
该方法根据目标类型进行不同的转换操作,确保数值类型的准确映射。
4.2 布尔类型转换
对于布尔类型,FastJson同样在TypeUtils.cast
方法中实现转换逻辑。当JSON数据为字符串时,会判断其是否为true
或false
。
if (type == boolean.class || type == Boolean.class) {if (value instanceof Boolean) {return value;}if (value instanceof String) {String str = (String) value;if ("true".equalsIgnoreCase(str)) {return true;} else if ("false".equalsIgnoreCase(str)) {return false;}}throw new JSONException("parse boolean error");
}
上述代码展示了布尔类型的转换逻辑,通过字符串匹配实现类型自适应。
五、复杂类型的自适应处理
5.1 自定义类的属性绑定
对于自定义Java类,FastJson通过反射遍历类的属性,并与JSON数据中的键进行匹配。
private void parseObject(Object object, Type clazz, Object fieldNameContext) {Class<?> rawClass = TypeUtils.getRawClass(clazz);Field[] fields = TypeUtils.compatibleWithJavaBean(rawClass) ? TypeUtils.getFields(rawClass) : TypeUtils.getDeclaredFields(rawClass);for (Field field : fields) {field.setAccessible(true);String fieldName = TypeUtils.getFieldName(field);if (!nextTokenWithColon(fieldName)) {continue;}Object value = parse();try {Type fieldType = field.getGenericType();Object realValue = TypeUtils.cast(value, fieldType, fieldNameContext);field.set(object, realValue);} catch (Exception e) {throw new JSONException("set property " + fieldName + " error", e);}}
}
该方法通过反射获取类的属性信息,并根据属性类型进行值的转换和绑定,实现自定义类的自适应映射。
5.2 集合类型处理
对于集合类型(如List
、Set
),FastJson首先创建集合实例,然后解析JSON数组中的每个元素,并进行类型转换。
private Collection<Object> createCollection(Type clazz) {if (List.class.isAssignableFrom((Class<?>) clazz)) {return new ArrayList<>();}if (Set.class.isAssignableFrom((Class<?>) clazz)) {return new HashSet<>();}// 其他集合类型处理return null;
}private Object parseArray(Type clazz, Object fieldNameContext) {JSONLexer lexer = this.lexer;if (lexer.token() != JSONToken.BEGIN_ARRAY) {throw new JSONException("expect [, actual " + lexer.tokenName());}lexer.nextToken();Collection<Object> collection = createCollection(clazz);Type collectionItemType = TypeUtils.getCollectionItemType(clazz, fieldNameContext);while (lexer.token() != JSONToken.END_ARRAY) {Object value = parse();if (collectionItemType != null) {value = TypeUtils.cast(value, collectionItemType, fieldNameContext);}collection.add(value);if (lexer.token() == JSONToken.COMMA) {lexer.nextToken();}}lexer.nextToken();return collection;
}
通过上述代码,FastJson能够根据集合的泛型类型,自动处理每个元素的类型转换。
5.3 Map类型处理
对于Map类型,FastJson解析JSON对象中的键值对,并根据Map的键值类型进行转换。
private Map<Object, Object> createMap(Type clazz) {if (Map.class.isAssignableFrom((Class<?>) clazz)) {return new HashMap<>();}// 其他Map类型处理return null;
}private Object parseMap(Type clazz, Object fieldNameContext) {JSONLexer lexer = this.lexer;if (lexer.token() != JSONToken.BEGIN_OBJECT) {throw new JSONException("expect {, actual " + lexer.tokenName());}lexer.nextToken();Map<Object, Object> map = createMap(clazz);Type keyType = TypeUtils.getMapKeyType(clazz, fieldNameContext);Type valueType = TypeUtils.getMapValueType(clazz, fieldNameContext);while (lexer.token() != JSONToken.END_OBJECT) {if (lexer.token() != JSONToken.LITERAL_STRING) {throw new JSONException("expect key, actual " + lexer.tokenName());}String keyStr = lexer.stringVal();lexer.nextToken();if (lexer.token() != JSONToken.COLON) {throw new JSONException("expect :, actual " + lexer.tokenName());}lexer.nextToken();Object value = parse();if (keyType != null) {keyStr = (String) TypeUtils.cast(keyStr, keyType, fieldNameContext);}if (valueType != null) {value = TypeUtils.cast(value, valueType, fieldNameContext);}map.put(keyStr, value);if (lexer.token() == JSONToken.COMMA) {lexer.nextToken();}}lexer.nextToken();return map;
}
上述代码展示了Map类型的自适应处理逻辑,通过解析键值类型实现准确的映射。
六、泛型类型的自适应解析
6.1 泛型参数获取
对于包含泛型的类型,FastJson通过TypeUtils
类获取泛型参数。例如,获取集合元素类型:
public static Type getCollectionItemType(Type type, Object fieldNameContext) {if (type instanceof ParameterizedType) {ParameterizedType parameterizedType = (ParameterizedType) type;Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();if (actualTypeArguments != null && actualTypeArguments.length > 0) {return actualTypeArguments[0];}}return Object.class;
}
该方法通过ParameterizedType
接口获取泛型参数数组,从而确定集合元素的具体类型。
6.2 泛型类型转换
在获取泛型参数后,FastJson在TypeUtils.cast
方法中进行类型转换:
public static Object cast(Object value, Type type, Object fieldNameContext) {if (type instanceof ParameterizedType) {ParameterizedType parameterizedType = (ParameterizedType) type;Type rawType = parameterizedType.getRawType();if (rawType == List.class) {Type itemType = parameterizedType.getActualTypeArguments()[0];// 处理List元素类型转换}if (rawType == Map.class) {Type keyType = parameterizedType.getActualTypeArguments()[0];Type valueType = parameterizedType.getActualTypeArguments()[1];// 处理Map键值类型转换}}// 其他类型处理逻辑
}
通过上述代码,FastJson能够根据泛型参数进行准确的类型转换,实现泛型类型的自适应。
七、注解驱动的类型自适应
7.1 @JSONField注解
@JSONField
注解用于指定属性名、日期格式、序列化/反序列化顺序等。在反序列化时,FastJson通过反射获取该注解,并根据注解配置调整类型转换逻辑。
public class User {@JSONField(name = "user_name")private String name;@JSONField(format = "yyyy-MM-dd")private Date birthday;
}private void parseObject(Object object, Type clazz, Object fieldNameContext) {Class<?> rawClass = TypeUtils.getRawClass(clazz);Field[] fields = TypeUtils.compatibleWithJavaBean(rawClass) ? TypeUtils.getFields(rawClass) : TypeUtils.getDeclaredFields(rawClass);for (Field field : fields) {JSONField jsonField = field.getAnnotation(JSONField.class);if (jsonField != null) {String propertyName = jsonField.name();if (!"".equals(propertyName)) {// 使用注解指定的名称进行匹配}if (jsonField.format() != null && field.getType() == Date.class) {// 使用指定格式解析日期}}// 省略其他属性处理逻辑}
}
7.2 @JSONType注解
@JSONType
注解用于类级别配置,如指定子类、序列化器等。在反序列化时,FastJson根据该注解实现多态类型的自适应。
@JSONType(typeName = "user", subTypes = {AdminUser.class, NormalUser.class})
public interface User {// 接口定义
}public Object parseObject(String text, Type clazz) {JSONObject jsonObject = JSON.parseObject(text);if (jsonObject.containsKey("@type")) {String typeName = jsonObject.getString("@type");Class<?> subType = typeNameToClassMap.get(typeName);if (subType != null) {return parseObject(jsonObject, subType);}}return parseObject(jsonObject, clazz);
}
上述代码展示了@JSONType
注解在多态类型处理中的作用,通过类型名称映射实现子类的自适应解析。
八、自定义类型适配器
8.1 实现ObjectDeserializer接口
开发者可通过实现ObjectDeserializer
接口自定义类型的反序列化逻辑。例如,自定义日期反序列化器:
public class CustomDateDeserializer implements ObjectDeserializer {@Overridepublic Date deserialze(JSONParser parser, Type type, Object fieldName) {JSONLexer lexer = parser.getLexer();if (lexer.token() == JSONToken.LITERAL_STRING) {String text = lexer.stringVal();try {return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(text);} catch (ParseException e) {throw new JSONException("parse date error", e);}}throw new JSONException("expect date string");}@Overridepublic int getFastMatchToken() {return JSONToken.LITERAL_STRING;}
}
8.2 注册自定义反序列化器
将自定义反序列化器注册到ParserConfig
:
ParserConfig.getGlobalInstance().putDeserializer(Date.class, new CustomDateDeserializer());
注册后,FastJson在遇到Date
类型时,会使用自定义反序列化器进行解析,实现更灵活的类型自适应。
九、性能优化与缓存机制
9.1 反序列化器缓存
FastJson通过缓存机制提高类型自适应的性能。ParserConfig
类维护了一个反序列化器缓存,避免重复创建。
public class ParserConfig {private final Map<Type, ObjectDeserializer> deserializers = new ConcurrentHashMap<>();public ObjectDeserializer getDeserializer(Type type) {ObjectDeserializer deserializer = deserializers.get(type);if (deserializer == null) {deserializer = createDeserializer(type
FastJson通过缓存机制提高类型自适应的性能。ParserConfig
类维护了一个反序列化器缓存,避免重复创建。
public class ParserConfig {private final Map<Type, ObjectDeserializer> deserializers = new ConcurrentHashMap<>();public ObjectDeserializer getDeserializer(Type type) {ObjectDeserializer deserializer = deserializers.get(type);if (deserializer == null) {deserializer = createDeserializer(type);deserializers.put(type, deserializer);}return deserializer;}private ObjectDeserializer createDeserializer(Type type) {if (type instanceof Class) {Class<?> clazz = (Class<?>) type;if (clazz.isEnum()) {return new EnumDeserializer(clazz);}// 处理其他类类型}// 处理泛型类型等其他情况return JavaBeanDeserializerFactory.createJavaBeanDeserializer(type, this);}
}
通过这种缓存机制,当多次对同一类型进行反序列化时,FastJson直接从缓存中获取反序列化器,减少了反射调用和对象创建的开销,显著提升了性能。
9.2 ASM优化
FastJson利用ASM(Java字节码操作框架)动态生成反序列化器,进一步优化类型自适应过程。ASMDeserializerFactory
类负责字节码生成:
public class ASMDeserializerFactory {public ObjectDeserializer createJavaBeanDeserializer(Class<?> clazz, ParserConfig config) {ClassNode classNode = new ClassNode();ClassReader classReader = new ClassReader(clazz.getName());classReader.accept(classNode, 0);// 生成反序列化方法MethodVisitor mv = classNode.visitMethod(Opcodes.ACC_PUBLIC, "deserialize","(Lcom/alibaba/fastjson/parser/JSONParser;Ljava/lang/reflect/Type;Ljava/lang/Object;)Ljava/lang/Object;",null, null);mv.visitCode();// 创建对象实例mv.visitTypeInsn(Opcodes.NEW, clazz.getName().replace('.', '/'));mv.visitInsn(Opcodes.DUP);mv.visitMethodInsn(Opcodes.INVOKESPECIAL, clazz.getName().replace('.', '/'), "<init>", "()V", false);// 遍历类字段,生成属性赋值字节码for (FieldNode fieldNode : classNode.fields) {// 获取字段类型和名称String fieldDesc = fieldNode.desc;String fieldName = fieldNode.name;// 从JSON解析值mv.visitVarInsn(Opcodes.ALOAD, 1);mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "com/alibaba/fastjson/parser/JSONParser", "parse", "()Ljava/lang/Object;", false);// 进行类型转换Type fieldType = TypeUtils.parseType(fieldDesc);if (!fieldType.equals(Object.class)) {mv = TypeUtils.castToJavaCode(mv, fieldType);}// 赋值给对象字段mv.visitVarInsn(Opcodes.ALOAD, 2);mv.visitFieldInsn(Opcodes.PUTFIELD, clazz.getName().replace('.', '/'), fieldName, fieldDesc);}// 返回对象实例mv.visitVarInsn(Opcodes.ALOAD, 2);mv.visitInsn(Opcodes.ARETURN);mv.visitMaxs(0, 0);mv.visitEnd();// 生成字节码并加载类ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);classNode.accept(cw);byte[] code = cw.toByteArray();ClassLoader classLoader = Thread.currentThread().getContextClassLoader();Class<?> generatedClass = defineClass(clazz.getName() + "$FastJsonDeserializer", code, 0, code.length, classLoader);return (ObjectDeserializer) generatedClass.getConstructor(ParserConfig.class).newInstance(config);}
}
通过直接操作字节码生成反序列化逻辑,避免了反射带来的性能损耗,使类型自适应过程更加高效。生成的字节码针对具体类型定制,减少了通用逻辑判断,提升了执行速度。
9.3 快速匹配机制
FastJson在反序列化器中实现了快速匹配机制,ObjectDeserializer
接口的getFastMatchToken
方法用于指定反序列化器能处理的Token类型:
public interface ObjectDeserializer {Object deserialze(JSONParser parser, Type type, Object fieldName);int getFastMatchToken();
}
例如,字符串类型的反序列化器会返回JSONToken.LITERAL_STRING
:
public class StringDeserializer implements ObjectDeserializer {@Overridepublic Object deserialze(JSONParser parser, Type type, Object fieldName) {return parser.lexer.stringVal();}@Overridepublic int getFastMatchToken() {return JSONToken.LITERAL_STRING;}
}
在解析过程中,JSONParser
优先根据Token类型查找对应的反序列化器,减少了不必要的类型检查和匹配,提升了整体解析效率。
十、多态类型的自适应处理
10.1 类型信息存储与识别
FastJson通过在JSON数据中添加类型信息实现多态类型的自适应。默认情况下,当序列化一个接口或抽象类的实例时,FastJson会在JSON中添加@type
字段:
public class Animal {// 动物抽象类
}public class Dog extends Animal {// 狗类继承自动物类
}Animal dog = new Dog();
String json = JSON.toJSONString(dog, SerializerFeature.WriteClassName);
// 生成的JSON: {"@type":"Dog","...其他属性..."}
在反序列化时,JSONParser
通过检查@type
字段确定具体类型:
public Object parseObject(String text, Type clazz) {JSONObject jsonObject = JSON.parseObject(text);if (jsonObject.containsKey("@type")) {String typeName = jsonObject.getString("@type");Class<?> subType = TypeUtils.loadClass(typeName);if (subType != null) {return parseObject(jsonObject, subType);}}return parseObject(jsonObject, clazz);
}
通过这种方式,FastJson能够根据实际类型进行准确的反序列化,实现多态类型的自适应。
10.2 子类注册机制
除了自动添加@type
字段,FastJson还支持通过@JSONType
注解显式注册子类:
@JSONType(typeName = "animal", subTypes = {Dog.class, Cat.class})
public abstract class Animal {// 动物抽象类
}
FastJson在初始化时会扫描这些注解,构建类型映射表:
public class TypeUtils {private static final Map<String, Class<?>> typeNameMap = new HashMap<>();static {// 扫描所有带有@JSONType注解的类Reflections reflections = new Reflections("com.example");Set<Class<?>> classes = reflections.getTypesAnnotatedWith(JSONType.class);for (Class<?> clazz : classes) {JSONType jsonType = clazz.getAnnotation(JSONType.class);typeNameMap.put(jsonType.typeName(), clazz);}}public static Class<?> loadClass(String typeName) {return typeNameMap.get(typeName);}
}
通过这种机制,即使JSON数据中没有@type
字段,FastJson也能根据上下文和注册信息推断出具体类型,完成多态类型的自适应解析。
10.3 自定义多态处理
开发者可以通过实现自定义反序列化器处理复杂的多态情况。例如,根据JSON中的特定字段决定具体类型:
public class CustomPolymorphicDeserializer implements ObjectDeserializer {@Overridepublic Object deserialze(JSONParser parser, Type type, Object fieldName) {JSONLexer lexer = parser.getLexer();if (lexer.token() == JSONToken.BEGIN_OBJECT) {lexer.nextToken();String typeField = null;while (lexer.token() != JSONToken.END_OBJECT) {if (lexer.token() == JSONToken.LITERAL_STRING) {String key = lexer.stringVal();if ("type_field".equals(key)) {lexer.nextToken();typeField = lexer.stringVal();break;}}lexer.nextToken();}if ("type1".equals(typeField)) {return new Type1Object();} else if ("type2".equals(typeField)) {return new Type2Object();}}throw new JSONException("unsupported polymorphic type");}@Overridepublic int getFastMatchToken() {return JSONToken.BEGIN_OBJECT;}
}
注册该反序列化器后,FastJson在遇到相关类型时,会调用自定义逻辑进行多态处理,实现高度灵活的类型自适应。
十一、与Android平台特性的结合
11.1 内存管理优化
在Android环境中,内存资源相对有限,FastJson通过对象池技术减少内存分配和回收开销。以JSONReader
为例:
public class JSONReaderPool {private static final ObjectPool<JSONReader> POOL = new ObjectPool<JSONReader>() {@Overrideprotected JSONReader create() {return new JSONReader("");}};public static JSONReader borrowReader(String text) {JSONReader reader = POOL.borrowObject();reader.setInput(text);return reader;}public static void returnReader(JSONReader reader) {reader.setInput("");POOL.returnObject(reader);}
}
在进行JSON解析时,优先从对象池中获取JSONReader
实例,使用完毕后归还,避免了频繁创建和销毁对象带来的内存抖动,提升了Android应用的稳定性和性能。
11.2 线程安全处理
考虑到Android应用中多线程并发的场景,FastJson在关键类和操作上进行了线程安全设计。例如,ParserConfig
的全局实例获取采用同步机制:
public class ParserConfig {private static final ParserConfig globalInstance = new ParserConfig();private static final Object lock = new Object();public static ParserConfig getGlobalInstance() {synchronized (lock) {return globalInstance;}}
}
反序列化器缓存deserializers
使用ConcurrentHashMap
,确保在多线程环境下,反序列化器的创建和获取操作不会出现数据竞争和不一致问题,保证了类型自适应机制在多线程场景下的正确性和稳定性。
11.3 兼容性处理
由于Android系统版本众多,不同版本的Java运行时环境存在差异。FastJson在类型自适应过程中,对反射操作和类加载进行了兼容性处理。例如,在加载类时:
public class TypeUtils {public static Class<?> loadClass(String className) {try {return Class.forName(className);} catch (ClassNotFoundException e) {// 尝试通过其他类加载器加载ClassLoader classLoader = Thread.currentThread().getContextClassLoader();if (classLoader != null) {try {return classLoader.loadClass(className);} catch (ClassNotFoundException ex) {// 继续处理或抛出异常}}throw new JSONException("class not found: " + className, e);}}
}
通过多种方式尝试加载类,确保在不同Android系统环境下,都能正确识别和处理目标类型,保证类型自适应机制的正常运行 。
十二、类型自适应机制的扩展与定制
12.1 自定义命名策略
FastJson允许开发者通过实现NamingStrategy
接口来自定义属性命名策略,以适应不同的JSON数据格式。例如,实现驼峰命名和下划线命名的转换:
public class CamelCaseNamingStrategy implements NamingStrategy {@Overridepublic String translate(String propertyName) {StringBuilder result = new StringBuilder();for (int i = 0; i < propertyName.length(); i++) {char c = propertyName.charAt(i);if (Character.isUpperCase(c)) {if (i > 0) {result.append('_');}result.append(Character.toLowerCase(c));} else {result.append(c);}}return result.toString();}
}
注册自定义命名策略:
ParserConfig.getGlobalInstance().setNamingStrategy(new CamelCaseNamingStrategy());
通过这种方式,FastJson在进行属性匹配时,会按照自定义策略转换属性名,实现更灵活的类型自适应。
12.2 全局配置扩展
开发者可以通过SPI(Service Provider Interface)机制扩展FastJson的全局配置。在META-INF/services
目录下创建com.alibaba.fastjson.parser.ParserConfig
文件,指定自定义的ParserConfig
实现类:
public class MyParserConfig extends ParserConfig {@Overridepublic ObjectDeserializer getDeserializer(Type type) {// 自定义反序列化器获取逻辑if (type == MySpecialType.class) {return new MySpecialTypeDeserializer();}return super.getDeserializer(type);}
}
FastJson在启动时会自动加载该配置,使得自定义的类型处理逻辑融入到整体的类型自适应机制中,满足特定业务场景的需求。
12.3 插件化扩展
FastJson支持通过插件方式扩展类型自适应功能。开发者可以实现JSONScannerAware
、JSONSerializable
等接口,为特定类型添加自定义的序列化和反序列化逻辑。例如,为某个复杂类型添加自定义的反序列化逻辑:
public class ComplexType implements JSONSerializable {@Overridepublic void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {// 自定义序列化逻辑}@Overridepublic Object readResolve() throws ObjectStreamException {// 自定义反序列化后处理逻辑return this;}
}
通过这种插件化扩展方式,开发者可以在不修改FastJson核心代码的前提下,灵活定制类型自适应行为,增强框架的扩展性和适用性。