今天线上遇到一个问题,从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的时候出现了错误,可能是引号或者其它不可见字符导致的,查看实际数据并没有出现单双引号,但是出现了 u00A0u00A0u00A0u00A0u00A0u00A0, 是不应该出现问题的,那问题就只可能是u00A0 导致的,查看UNICODE对照表,发现u00A0确实是一个不可见字符
(unicode 对照表:https://unicode-table.com/en/#control-character):
u00A0转ASCII,正好是160
问题变得简单了,可能是fastjson 对不可见字符的支持问题,于是换了个最新版试一下,果然一切正常,问题是解决了,但是得找到具体原因,看了看源代码,当前使用的这个
版本(1.1.39) 确实有部分特殊字符未做处理。
可参考官方修正提交:https://github.com/alibaba/fastjson/commit/cdf7cb253e961666e2b3c2bdd423abe73ba4324a#diff-0