fastjson深度源码解析- 反序列化(一) - 反序列化解析介绍

概要

fastjson核心功能包括序列化和反序列化,反序列化的含义是将跨语言的json字符串转换成java对象。遇到到反序列化章节,这里假定你已经阅读并理解了词法分析章节的内容。

反序列化的章节比序列化复杂一些,我认为通过调试小单元代码片段的方式有助于理解,我在适当的地方会给出单元测试入口,集中精力理解具体类型的实现。

现在,我们正式开始理解反序列化实现吧。

    public static <T> T parseObject(String text, Class<T> clazz) {
        /** 根据指定text,返回期望的java对象类型class */
        return parseObject(text, clazz, new Feature[0]);
    }

这个反序列化接口可以处理对象包含任意字段类型,但是自身不能是泛型类型,原因是java的运行时类型擦除。fastjson给出了替代方法解决:

   String json = "[{},...]";
   Type listType = new TypeReference<List<Model>>() {}.getType();
   List<Model> modelList = JSON.parseObject(json, listType);

我们把关注点收回来,继续分析内部调用parseObject :

    public static <T> T parseObject(String json, Class<T> clazz, Feature... features) {
        return (T) parseObject(json, (Type) clazz, ParserConfig.global, null, DEFAULT_PARSER_FEATURE, features);
    }

        public static <T> T parseObject(String input, Type clazz, ParserConfig config, ParseProcess processor,
                                          int featureValues, Feature... features) {
        if (input == null) {
            return null;
        }

        /** 配置反序列化时启用的特性,比如是否允许json字符串字段不包含双引号 */
        if (features != null) {
            for (Feature feature : features) {
                featureValues |= feature.mask;
            }
        }

        /**
         *  初始化DefaultJSONParser,反序列化类型由它
         *  委托config查找具体序列化处理器处理
         */
        DefaultJSONParser parser = new DefaultJSONParser(input, config, featureValues);

        /** 添加拦截器 */
        if (processor != null) {
            if (processor instanceof ExtraTypeProvider) {
                parser.getExtraTypeProviders().add((ExtraTypeProvider) processor);
            }

            if (processor instanceof ExtraProcessor) {
                parser.getExtraProcessors().add((ExtraProcessor) processor);
            }

            if (processor instanceof FieldTypeResolver) {
                parser.setFieldTypeResolver((FieldTypeResolver) processor);
            }
        }

        /** 使用反序列化实例转换对象,查找具体序列化实例委托给config查找 */
        T value = (T) parser.parseObject(clazz, null);

        /** 处理json内部引用协议格式对象 */
        parser.handleResovleTask(value);

        parser.close();

        return (T) value;
    }

最终反序列化接口定义了执行的大框架:

  1. 创建解析配置ParserConfig对象,包括初始化内部反序列化实例和特性配置等。
  2. 添加反序列化拦截器
  3. 根据具体类型查找反序列化实例,执行反序列化转换
  4. 解析对象内部引用

我们继续查看parser.parseObject(clazz, null)逻辑:

    public <T> T parseObject(Type type, Object fieldName) {
        /** 获取json串第一个有效token */
        int token = lexer.t
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值