Android FastJson整体架构与模块划分
一、引言
在Android开发中,JSON数据格式的解析与处理是一项基础且关键的工作。FastJson作为阿里巴巴开源的高性能JSON处理库,因其卓越的解析速度和丰富的功能特性,被广泛应用于各类Android应用中。本文将从源码级别深入剖析FastJson的整体架构与模块划分,详细阐述其设计理念、核心组件及工作原理。
二、FastJson整体架构概述
2.1 架构设计目标
FastJson的架构设计主要追求以下目标:
- 高性能:通过优化算法和数据结构实现快速解析与序列化
- 灵活性:支持丰富的配置选项和扩展机制
- 兼容性:兼容多种JSON格式和特殊场景
- 易用性:提供简洁明了的API接口
2.2 核心架构层次
FastJson的架构可分为四个主要层次:
- API层:提供面向开发者的公共接口
- 解析/序列化引擎层:核心处理逻辑实现
- 数据处理层:负责JSON数据的具体操作
- 工具层:提供辅助功能和工具类
2.3 模块划分概览
FastJson主要包含以下核心模块:
- 解析模块:负责将JSON文本转换为Java对象
- 序列化模块:负责将Java对象转换为JSON文本
- 配置模块:管理解析和序列化的配置选项
- 类型处理模块:处理Java类型与JSON的映射关系
- 扩展模块:提供插件化扩展机制
- 工具模块:包含常用的辅助工具类
三、API层设计与实现
3.1 核心API类
FastJson的API层主要由以下几个核心类构成:
// com.alibaba.fastjson.JSON
public class JSON {
// 将Java对象序列化为JSON字符串
public static String toJSONString(Object object) { ... }
// 将JSON字符串反序列化为Java对象
public static <T> T parseObject(String text, Class<T> clazz) { ... }
// 将JSON字符串反序列化为JSONObject
public static JSONObject parseObject(String text) { ... }
// 将JSON字符串反序列化为JSONArray
public static JSONArray parseArray(String text) { ... }
// 其他重载方法...
}
// com.alibaba.fastjson.JSONObject
public class JSONObject extends JSON implements Map<String, Object>, Cloneable, Serializable {
// JSONObject的操作方法
public Object get(Object key) { ... }
public JSONObject put(String key, Object value) { ... }
public Set<String> keySet() { ... }
// 其他方法...
}
// com.alibaba.fastjson.JSONArray
public class JSONArray extends JSON implements List<Object>, Cloneable, RandomAccess, Serializable {
// JSONArray的操作方法
public Object get(int index) { ... }
public void add(int index, Object element) { ... }
public int size() { ... }
// 其他方法...
}
3.2 API使用示例
开发者可以通过简单的静态方法调用使用FastJson:
// 序列化示例
User user = new User("John", 30);
String jsonString = JSON.toJSONString(user);
// 反序列化示例
User parsedUser = JSON.parseObject(jsonString, User.class);
3.3 API层的设计模式
API层采用了多种设计模式:
- 门面模式:JSON类作为统一的门面接口,隐藏内部实现细节
- 工厂模式:通过静态工厂方法创建JSON对象
- 策略模式:根据不同的配置选项选择不同的处理策略
四、解析引擎层实现原理
4.1 解析流程概述
FastJson的解析流程主要包括以下步骤:
- 词法分析:将JSON文本分解为词法单元(Token)
- 语法分析:根据词法单元构建JSON对象结构
- 类型映射:将JSON数据映射到Java对象
- 对象构建:创建并初始化Java对象
4.2 词法分析器(Lexer)实现
词法分析器负责将JSON文本转换为Token序列:
// com.alibaba.fastjson.parser.Lexer
public class Lexer {
private final char[] text; // JSON文本
private int pos; // 当前位置
private int token; // 当前Token类型
// 解析下一个Token
public void scan() {
// 跳过空白字符
skipWhitespace();
// 根据当前字符确定Token类型
char ch = text[pos];
switch (ch) {
case '{':
token = JSONToken.LBRACE;
pos++;
break;
case '}':
token = JSONToken.RBRACE;
pos++;
break;
case '[':
token = JSONToken.LBRACKET;
pos++;
break;
case ']':
token = JSONToken.RBRACKET;
pos++;
break;
case ':':
token = JSONToken.COLON;
pos++;
break;
case ',':
token = JSONToken.COMMA;
pos++;
break;
case '"':
scanString(); // 扫描字符串
break;
case 'n':
scanNull(); // 扫描null
break;
case 't':
scanTrue(); // 扫描true
break;
case 'f':
scanFalse(); // 扫描false
break;
default:
if (ch >= '0' && ch <= '9' || ch == '-') {
scanNumber(); // 扫描数字
} else {
throw new JSONException("illegal character");
}
break;
}
}
// 其他扫描方法...
}
4.3 语法分析器(DefaultJSONParser)实现
语法分析器根据Token序列构建JSON对象:
// com.alibaba.fastjson.parser.DefaultJSONParser
public class DefaultJSONParser {
private final Lexer lexer; // 词法分析器
private final ParserConfig config; // 解析配置
// 解析JSON对象
public <T> T parseObject(Class<T> clazz) {
// 获取相应的ObjectDeserializer
ObjectDeserializer deserializer = config.getDeserializer(clazz);
// 调用反序列化方法
return (T) deserializer.deserialize(this, clazz, null);
}
// 解析JSON数组
public JSONArray parseArray() {
JSONArray array = new JSONArray();
// 处理数组开始符号
lexer.nextToken();
// 解析数组元素
while (true) {
if (lexer.token() == JSONToken.RBRACKET) {
lexer.nextToken();
break;
}
// 解析数组元素
Object value = parse();
array.add(value);
// 处理逗号分隔符
if (lexer.token() == JSONToken.COMMA) {
lexer.nextToken();
continue;
}
if (lexer.token() == JSONToken.RBRACKET) {
lexer.nextToken();
break;
}
throw new JSONException("syntax error");
}
return array;
}
// 其他解析方法...
}
4.4 类型反序列化器(ObjectDeserializer)
FastJson通过ObjectDeserializer
接口处理不同类型的反序列化:
// com.alibaba.fastjson.parser.deserializer.ObjectDeserializer
public interface ObjectDeserializer {
<T> T deserialize(DefaultJSONParser parser, Type type, Object fieldName);
int getFastMatchToken();
}
不同类型的反序列化器实现该接口,例如:
// com.alibaba.fastjson.parser.deserializer.StringDeserializer
public class StringDeserializer implements ObjectDeserializer {
public final static StringDeserializer instance = new StringDeserializer();
@Override
public <T> T deserialize(DefaultJSONParser parser, Type type, Object fieldName) {
final JSONLexer lexer = parser.lexer;
// 处理字符串类型
if (lexer.token() == JSONToken.LITERAL_STRING) {
String val = lexer.stringVal();
lexer.nextToken(JSONToken.COMMA);
return (T) val;
}
// 处理其他类型
if (lexer.token() == JSONToken.NULL) {
lexer.nextToken();
return null;
}
// 处理特殊情况
Object value = parser.parse();
if (value == null) {
return null;
}
return (T) value.toString();
}
@Override
public int getFastMatchToken() {
return JSONToken.LITERAL_STRING;
}
}
五、序列化引擎层实现原理
5.1 序列化流程概述
FastJson的序列化流程主要包括:
- 对象遍历:递归遍历Java对象的所有字段
- 类型处理:根据字段类型选择合适的序列化器
- JSON构建:将对象转换为JSON格式文本
- 输出处理:生成最终的JSON字符串
5.2 序列化器(ObjectSerializer)接口
// com.alibaba.fastjson.serializer.ObjectSerializer
public interface ObjectSerializer {
void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException;
}
5.3 序列化器实现示例
以StringSerializer
为例:
// com.alibaba.fastjson.serializer.StringSerializer
public class StringSerializer implements ObjectSerializer {
public final static StringSerializer instance = new StringSerializer();
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
SerializeWriter out = serializer.out;
String str = (String) object;
if (str == null) {
out.writeNull();
return;
}
// 处理特殊字符
char[] chars = str.toCharArray();
for (char c : chars) {
switch (c) {
case '\"':
out.write("\\\"");
break;
case '\\':
out.write("\\\\");
break;
case '\b':
out.write("\\b");
break;
case '\f':
out.write("\\f");
break;
case '\n':
out.write("\\n");
break;
case '\r':
out.write("\\r");
break;
case '\t':
out.write("\\t");
break;
default:
out.write(c);
break;
}
}
}
}
5.4 JSON生成器(SerializeWriter)
SerializeWriter
负责生成JSON文本:
// com.alibaba.fastjson.serializer.SerializeWriter
public class SerializeWriter extends Writer {
private char[] buf;
private int count;
// 写入各种类型的数据
public void write(char c) {
ensureCapacity(count + 1);
buf[count++] = c;
}
public void write(String str) {
if (str == null) {
writeNull();
return;
}
int len = str.length();
ensureCapacity(count + len);
str.getChars(0, len, buf, count);
count += len;
}
public void writeNull() {
write("null");
}
// 其他写入方法...
}
六、配置模块设计与实现
6.1 配置类(ParserConfig/SerializerFeature)
FastJson通过ParserConfig
和SerializerFeature
管理解析和序列化配置:
// com.alibaba.fastjson.parser.ParserConfig
public class ParserConfig {
// 全局配置实例
public static final ParserConfig global = new ParserConfig();
// 类型反序列化器缓存
private final ConcurrentHashMap<Type, ObjectDeserializer> deserializers = new ConcurrentHashMap<Type, ObjectDeserializer>();
// 其他配置选项
private boolean autoTypeSupport = false;
private boolean asmEnable = true;
// 其他配置项...
// 获取反序列化器
public ObjectDeserializer getDeserializer(Type type) {
ObjectDeserializer deserializer = deserializers.get(type);
if (deserializer == null) {
// 创建并缓存新的反序列化器
deserializer = createDeserializer(type);
deserializers.putIfAbsent(type, deserializer);
}
return deserializer;
}
// 其他配置方法...
}
// com.alibaba.fastjson.serializer.SerializerFeature
public enum SerializerFeature {
QuoteFieldNames, // 字段名使用引号
UseSingleQuotes, // 使用单引号
WriteMapNullValue, // 输出null值
WriteEnumUsingToString, // 枚举使用toString()
// 其他特性...
}
6.2 配置使用示例
开发者可以通过以下方式配置FastJson:
// 配置序列化特性
String jsonString = JSON.toJSONString(obj,
SerializerFeature.WriteMapNullValue,
SerializerFeature.QuoteFieldNames);
// 配置解析特性
ParserConfig config = new ParserConfig();
config.setAutoTypeSupport(true);
Object obj = JSON.parseObject(jsonString, Object.class, config);
七、类型处理模块实现原理
7.1 类型映射机制
FastJson通过TypeUtils
类处理Java类型与JSON的映射:
// com.alibaba.fastjson.util.TypeUtils
public class TypeUtils {
// 将JSON对象转换为指定类型
public static Object cast(Object obj, Type type, ParserConfig config) {
if (obj == null) {
return null;
}
// 处理基本类型
if (type instanceof Class<?>) {
Class<?> clazz = (Class<?>) type;
if (clazz == Integer.class || clazz == int.class) {
return castToInt(obj);
}
if (clazz == Long.class || clazz == long.class) {
return castToLong(obj);
}
// 其他基本类型处理...
}
// 处理泛型类型
if (type instanceof ParameterizedType) {
// 处理泛型类型逻辑...
}
// 其他类型处理...
return obj;
}
// 其他类型处理方法...
}
7.2 自动类型支持
FastJson通过@type
字段支持自动类型识别:
// 序列化时包含类型信息
String jsonString = JSON.toJSONString(obj, SerializerFeature.WriteClassName);
// 反序列化时自动识别类型
Object obj = JSON.parseObject(jsonString, Object.class);
7.3 自定义类型处理器
开发者可以通过实现ObjectSerializer
和ObjectDeserializer
接口自定义类型处理:
// 自定义序列化器
public class DateSerializer implements ObjectSerializer {
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
Date date = (Date) object;
serializer.write(date.getTime());
}
}
// 注册自定义序列化器
SerializeConfig.getGlobalInstance().put(Date.class, new DateSerializer());
八、扩展模块设计与实现
8.1 过滤器机制
FastJson通过过滤器机制允许开发者在序列化和解析过程中插入自定义逻辑:
// com.alibaba.fastjson.serializer.ValueFilter
public interface ValueFilter extends SerializeFilter {
Object process(Object object, String name, Object value);
}
// 使用示例
ValueFilter filter = new ValueFilter() {
@Override
public Object process(Object object, String name, Object value) {
if (value instanceof String) {
return ((String) value).toUpperCase();
}
return value;
}
};
String jsonString = JSON.toJSONString(obj, filter);
8.2 序列化/反序列化扩展
开发者可以通过SPI机制扩展FastJson的功能:
// 定义扩展接口
public interface FastJsonProvider {
ObjectSerializer getSerializer(Class<?> clazz);
ObjectDeserializer getDeserializer(Class<?> clazz);
}
// 实现扩展
public class MyFastJsonProvider implements FastJsonProvider {
@Override
public ObjectSerializer getSerializer(Class<?> clazz) {
if (clazz == MyClass.class) {
return new MyClassSerializer();
}
return null;
}
@Override
public ObjectDeserializer getDeserializer(Class<?> clazz) {
if (clazz == MyClass.class) {
return new MyClassDeserializer();
}
return null;
}
}
// 在META-INF/services目录下创建文件
// 文件名为com.alibaba.fastjson.spi.FastJsonProvider
// 内容为实现类的全限定名
九、工具模块功能详解
9.1 常用工具类
FastJson提供了多个实用工具类:
- JSONPath:用于JSON路径表达式查询
- JSONValidator:用于JSON格式验证
- IOUtils:提供IO操作辅助方法
- ASMUtils:提供ASM相关工具方法
9.2 JSONPath实现原理
JSONPath允许通过路径表达式访问JSON数据:
// 使用示例
JSONObject jsonObject = JSON.parseObject(jsonString);
Object value = JSONPath.eval(jsonObject, "$.user.name");
// JSONPath核心类
// com.alibaba.fastjson.JSONPath
public class JSONPath {
private final Expression expression;
// 编译路径表达式
public static JSONPath compile(String path) {
return new JSONPath(Expression.compile(path));
}
// 计算路径表达式的值
public Object eval(Object rootObject) {
return expression.eval(rootObject);
}
// 其他方法...
}
十、FastJson在Android中的优化与适配
10.1 Android环境适配
FastJson针对Android环境做了以下优化:
- 减少反射使用,提高性能
- 优化内存占用,避免OOM
- 适配Android不同版本的类加载机制
- 支持Android的ProGuard混淆
10.2 性能优化
FastJson在Android中的性能优化措施:
- 使用ASM生成序列化和反序列化代码
- 实现对象池复用机制,减少对象创建开销
- 优化字符串处理,减少内存分配
- 支持并行解析和序列化
10.3 Android使用注意事项
在Android中使用FastJson需要注意:
- 处理大文件时使用流式解析
- 合理配置序列化和解析参数
- 避免在主线程进行复杂的JSON处理
- 处理特殊字符和编码问题