fastjson报java.lang.ArrayIndexOutOfBoundsException: 160

今天线上遇到一个问题,从hbase里读取出来的数据在转换json后输出时出现异常:

java.lang.ArrayIndexOutOfBoundsException: 160
        at com.alibaba.fastjson.serializer.SerializeWriter.writeStringWithDoubleQuote(SerializeWriter.java:868)
        at com.alibaba.fastjson.serializer.SerializeWriter.writeStringWithDoubleQuote(SerializeWriter.java:602)
        at com.alibaba.fastjson.serializer.SerializeWriter.writeString(SerializeWriter.java:1411)
        at com.alibaba.fastjson.serializer.StringCodec.write(StringCodec.java:49)
        at com.alibaba.fastjson.serializer.StringCodec.write(StringCodec.java:34)
        at com.alibaba.fastjson.serializer.MapSerializer.write(MapSerializer.java:188)
        at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:158)
        at com.alibaba.fastjson.serializer.MapSerializer.write(MapSerializer.java:188)
        at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:369)
        at com.alibaba.fastjson.JSON.toJSONString(JSON.java:596)
        at com.alibaba.fastjson.JSON.toString(JSON.java:590)
        at java.lang.String.valueOf(String.java:2854)
        at java.io.PrintStream.println(PrintStream.java:821)

从异常信息中可以看出是在json toString的时候出现了错误,可能是引号或者其它不可见字符导致的,查看实际数据并没有出现单双引号,但是出现了\t\u00A0\u00A0\u00A0\u00A0\u00A0\u00A0,\t是不应该出现问题的,那问题就只可能是\u00A0 导致的,查看UNICODE对照表,发现\u00A0确实是一个不可见字符

(unicode 对照表:https://unicode-table.com/en/#control-character):

\u00A0转ASCII,正好是160

问题变得简单了,可能是fastjson 对不可见字符的支持问题,于是换了个最新版试一下,果然一切正常,问题是解决了,但是得找到具体原因,看了看源代码,当前使用的这个

版本(1.1.39以及1.1.39以下版本) 确实有部分特殊字符未做处理。

解决:将fastjson-1.1.39.jar升级到fastjson-1.2.47.jar 问题解决

 可参考官方修正提交:https://github.com/alibaba/fastjson/commit/cdf7cb253e961666e2b3c2bdd423abe73ba4324a#diff-0

文章来源:https://www.cnblogs.com/jessezeng/p/6758569.html

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值