fastJSON源码分析_7_toJavaObject类浅析

2021SC@SDUSC

 本篇简介

        在之前几篇文章中我们分析了writeJSONString这个方法的所有组成类以及实现该方法的思路,可能不是非常地详细,但是至少我们分析出了其大致的代码结构以及它在提高代码运行效率上所采用的优化策略.本篇我们将先放下该部分的内容,开始继续分析fastJSON源码中JSON类所提供的其他方法.按照组内分工要求,我本篇应该分析的内容是toJavaObject方法,该方法的主要目的是将JSON 对象转化为其对应的java对象.

         事实上,我们一般使用的是JSON.parseObject方法来直接将json字符串转化为java对象,但是有时后我们可能拿到的数据直接是一个JSON对象(比如拿到json字符串后希望在json对象层面进行修改,再转换为java对象),所以该方法可以帮助我们进行一个类型的转化.

 使用例子

         我们仍然使用前面篇章的例子,先初始化一个Map.

        因为JSONObject的构建需要Map对象作为参数.

         之后我们调用JSON的toJavaObject方法,并且将其转化为Person对象并打印,最终结果如下:

         这表示我们成功通过该方法将JavaObject对象转化为了java对象.

源码分析

        事实上,不仅仅是JSONObject可以进行转化,JSONArray也同样可以进行转化,这是因为toJavaObject方法传入的参数是JSON对象,而JSONObject和JSONArray都是JSON的子类.

 不同参数的方法

        我们发现,这里有3个重载方法,其中第一个方法是静态的方法,另外两个则不是,并且前两个方法也有相似的参数.

        这是因为,虽然说JSON作为fastJSON的主要入口类,但它同时还承担了作为JSON对象的父类的责任(这算耦合了吗??),所以说当我们使用JSON类名调用同名方法时,只能使用第一个方法,传入两个参数,而当我们创建的是一个JSON对象的时候调用该方法则使用的是第二或者第三个重载方法.所以说,在上面的例子中,我们也可以按照如下方法使用,结果相同:

 而第三个方法是使用的type接口来接收一切类型的参数.

TypeUtils.cast()

继续分析源码,该方法的实现借助了工具类TypeUtils,而该类在对象序列化器的实现中,我们已经提到过了,这里我们便使用了TypeUtils的类型转化方法,cast()方法.这里我们直接看cast方法,该类我们将在下一篇单独分析. 

       

 该方法的总体内容就是判断obj和clazz的类型然后输出相应的内容,比如obj如果为空那么就根据clazz是基本数据类型的包装类还是普通类来决定输出的值是0或者null或者false等.然后还有判断需要转化的类是否是map,集合,或者是否就是obj的父类.

虽然判断了很多,但是实际上我们关注的是,我们自定义的类是如何进行转化的呢,所以我们直接来到该方法的最后

 最后发现,该方法其实是将我们的json对象直接通过toJsonString转化为字符串,然后再利用JSON.parseObject方法将其转化为java对象......

总结

该方法实际上和parseObject方法功能相同,甚至在实现上直接使用了parseObject方法,总的来说,该方法是作为反序列化的一个补充.

        

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值