故事起因:项目马上交付,突然碰到个问题。对方接口返回的json数据后,我们解析报错,心里那个急啊。
故事经过:
Exception in thread "main" net.sf.json.JSONException: Unterminated string at character 18 of [{..
当时的错误没了,当时报的是29012行,控制台根本显示不了这么多行,定位不到是具体是哪个位置,后来想了个办法,用了substring 截取字符串,让其显示错误位置,那个地方有空格,当时很奇怪,也没多想,直接用replaceAll 清空所有空格。结果不行。东整西整,换了json的jar包,replaceAll \n\r 制表符,中文字符,但都没用。后来一位大神发现了问题。
说是空字符的问题,然后给了我一串代码,让我把解析之前执行这个函数
/**
* 去除空字符
* @param str
* @return
*/
public static String convert(String str){
byte[] bytes = new byte[str.getBytes().length];
int pos = 0;
for(byte b:str.getBytes()){
if(b!=0){
bytes[pos] = b;
pos++;
}
System.out.println(new String(bytes));
}
return new String(bytes);
}
故事结局:问题解决。
故事回顾:我后来找了一下,应该是空字符的问题,用replaceAll(" ","")是清除空格,不能清除空字符。
另:附 \n,空字符,\0的关系:
\0和\n在C语言中都是转义字符。
\0 表示空字符NULL,对应的ASCII码为0,通常用来表示字符串的结束标志;
\n 表示回车换行,对应的ASCII码为10,通常用在printf函数中,输出换行;