fastjson的这些坑,你误入了没?( 二 ) 2020-11-28 由于依赖包升级导致不兼容的情况很常见 , 不过绝大多数都是向下兼容的 , 例如 JDK ... 5、6、7、8 ... , 所以如果你正在开发核心代码 , 若涉及到版本更新 , 尽量考虑兼容性问题 , 如果涉及到老功能废弃时 , 不妨采用注解标注一下 , 这样后人会尽早发现问题 。 不规范的传入:导致内存溢出 分享一段有意思的代码 , 一起享受其中乐趣 。 import com.alibaba.fastjson.JSON;/** * fastjson 坑啊! * @author 一猿小讲 */public class T {public static void main(String[] args) {String str = "{\"key1\":\"\\value1\"}";Object obj = JSON.parse(str);System.out.println(obj);}}代码能跑起来 , 运行结果绝对正常 {"key1":"\u000Balue1"}此时 , 我们动点手脚 , 把 value1 的值变掉 String str = "{\"key1\":\"\\x";程序运行 , word 天 , 惊呆! Exception in thread "main" java.lang.OutOfMemoryError: Java heap spaceat com.alibaba.fastjson.parser.JSONLexerBase.putChar(JSONLexerBase.java:2835)at com.alibaba.fastjson.parser.JSONLexerBase.scanString(JSONLexerBase.java:866)at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:428)at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1302)at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1268)at com.alibaba.fastjson.JSON.parse(JSON.java:137)at com.alibaba.fastjson.JSON.parse(JSON.java:128)at T.main(T.java:11)好奇不?咋回事?Debug 分析一番就清楚啦 。文章插图 当 json 字符串是以 \x 结尾时 , 由于低版本的 fastjson 并未对其进行校验 , 将会导致其继续尝试获取字符 。文章插图 由于 index>= this.len 始终成立 , 则意味着会直接获取到 \u001A , 相当于 26 , 带来的结果就是 isEOF 永远为 false , 意味着要无休止的读下去 。文章插图 就这样陷入了死循环 1-->2-->3-->1 , 直到内存溢出 。文章插图 Debug 一趟肯定比我说的要清楚 , 当然 , 此问题早已在版本 1.2.60 中修复 。文章插图 1.2.70 版本肯定也不会有此问题啦 , 在高版本下直接提示格式错误啦 , 摆脱了内存溢出 。 Exception in thread "main" com.alibaba.fastjson.JSONException: invalid escape character \xat com.alibaba.fastjson.parser.JSONLexerBase.scanString(JSONLexerBase.java:984)at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:479)at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1401)at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1367)at com.alibaba.fastjson.JSON.parse(JSON.java:183)at com.alibaba.fastjson.JSON.parse(JSON.java:193)at com.alibaba.fastjson.JSON.parse(JSON.java:149)at T.main(T.java:11)走心: 金无足赤人无完人 , 代码有 Bug 很正常 , 需要一步一步去迭代 , 要敢于让团队犯错、试错、容错 。 通过此段测试 , 项目开发中参数格式校验就很有必要 。 寄语写最后本次 , 仅以项目中依赖 fastjson 类库作为切入点 , 主要想传达:在使用三方轮子时 , 尽可能做对三方的轮子了如指掌 , 知己知彼方能百战不殆 。 另外 , 借助 fastjson 升级的事情 , 也想传达写出规范性的代码 , 是很有必要 , 不然升级的时候就很麻烦 。 代码修炼系列分享 , 仍会结合实际项目进行继续分享 , 请各位持续关注 。 (一)改掉这些坏习惯 , 还怕写不出健壮的代码? (二)改掉这些坏习惯 , 还怕写不出优雅的代码? (三)改掉这些坏习惯 , 还怕写不出优雅的代码? (四)改掉这些坏习惯 , 还怕写不出健壮的代码? (五)改掉这些坏习惯 , 还怕写不出精简的代码? (六)改掉这些坏习惯 , 还怕写不出精简的代码? 好了 , 本次就谈到这里 , 一起聊技术、谈业务、喷架构 , 少走弯路 , 不踩大坑 。 欢迎关注「一猿小讲」 , 会持续输出原创精彩分享 , 敬请期待! 上一页12下一页 智能手机市场|华为再拿第一!27%的份额领跑全行业,苹果8%排在第四名! 会员|美容院使用会员管理软件给顾客更好的消费体验! 行业|现在行业内客服托管费用是怎么算的 人民币|天猫国际新增“服务大类”,知舟集团提醒入驻这些类目的要注意 国外|坐拥77件专利,打破国外的垄断,造出中国最先进的家电芯片 技术|做“视频”绿厂是专业的,这项技术获人民日报评论点赞 面临|“熟悉的陌生人”不该被边缘化 中国|浅谈5G移动通信技术的前世和今生 页面|如何简单、快速制作流程图?上班族的画图技巧get 桌面|日常使用的软件及网站分享 篇一:几个动态壁纸软件和静态壁纸网站:助你美化你的桌面