fastjson的这些坑,你误入了没?( 二 )

  • 由于依赖包升级导致不兼容的情况很常见 , 不过绝大多数都是向下兼容的 , 例如 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 分析一番就清楚啦 。
    fastjson的这些坑,你误入了没?文章插图
    当 json 字符串是以 \x 结尾时 , 由于低版本的 fastjson 并未对其进行校验 , 将会导致其继续尝试获取字符 。
    fastjson的这些坑,你误入了没?文章插图
    由于 index>= this.len 始终成立 , 则意味着会直接获取到 \u001A , 相当于 26 , 带来的结果就是 isEOF 永远为 false , 意味着要无休止的读下去 。
    fastjson的这些坑,你误入了没?文章插图
    就这样陷入了死循环 1-->2-->3-->1 , 直到内存溢出 。
    fastjson的这些坑,你误入了没?文章插图
    Debug 一趟肯定比我说的要清楚 , 当然 , 此问题早已在版本 1.2.60 中修复 。
    fastjson的这些坑,你误入了没?文章插图
    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 升级的事情 , 也想传达写出规范性的代码 , 是很有必要 , 不然升级的时候就很麻烦 。 代码修炼系列分享 , 仍会结合实际项目进行继续分享 , 请各位持续关注 。
    (一)改掉这些坏习惯 , 还怕写不出健壮的代码?
    (二)改掉这些坏习惯 , 还怕写不出优雅的代码?
    (三)改掉这些坏习惯 , 还怕写不出优雅的代码?
    (四)改掉这些坏习惯 , 还怕写不出健壮的代码?
    (五)改掉这些坏习惯 , 还怕写不出精简的代码?
    (六)改掉这些坏习惯 , 还怕写不出精简的代码?
    好了 , 本次就谈到这里 , 一起聊技术、谈业务、喷架构 , 少走弯路 , 不踩大坑 。 欢迎关注「一猿小讲」 , 会持续输出原创精彩分享 , 敬请期待!