案例
java定义一个标准的json字符串:
String jsonStr = "{\"status\":0}";
尝试使用 net.sf.json.JSONObject 或 com.alibaba.fastjson.JSONObject 进行转码:
net.sf.json.JSONObject obj1 = net.sf.json.JSONObject.fromObject(jsonStr);
com.alibaba.fastjson.JSONObject obj2 = com.alibaba.fastjson.JSONObject.parseObject(jsonStr);
不可思议的是,两种转换方式均出现了异常:
Exception in thread "main" net.sf.json.JSONException: A JSONObject text must begin with '{' at character 1 of {"status":0}
at net.sf.json.util.JSONTokener.syntaxError(JSONTokener.java:505)
at net.sf.json.JSONObject._fromJSONTokener(JSONObject.java:1144)
at net.sf.json.JSONObject._fromString(JSONObject.java:1373)
at net.sf.json.JSONObject.fromObject(JSONObject.java:161)
at net.sf.json.JSONObject.fromObject(JSONObject.java:130)
at io.rong.util.HttpUtil.main(HttpUtil.java:235)
Exception in thread "main" com.alibaba.fastjson.JSONException: syntax error, pos 2
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1240)
at com.alibaba.fastjson.parser.DefaultJSONParser.parse(DefaultJSONParser.java:1153)
at com.alibaba.fastjson.JSON.parse(JSON.java:102)
at com.alibaba.fastjson.JSON.parse(JSON.java:93)
at com.alibaba.fastjson.JSON.parseObject(JSON.java:164)
at io.rong.util.HttpUtil.main(HttpUtil.java:236)
从上面定义的json格式来看,我们定义的json字符串没问题,但是为何一个标准的json字符串却不能直接转换成JSONObject对象?
于是我将字符串转换成Char数组以单个字符输出:
String jsonStr = "{\"status\":0}";
char str[] = jsonStr.toString().toCharArray();
for (int i = 0; i < str.length; i++) {
System.out.print(str[i] + " ");
}
意外的发现控制台会多输出两个“.”
同样,我们再定义一个字符串,并输出长度:
String jsonStr = "jsonStr";
理论上字符串“jsonStr”的长度应该为7,但实际输出的长度为何是9?而通过char字符输出时,为何会有两个“.”?这个问题抛给接下来的读者自己去探索。
解决方案
将字符串Unicode解码或通过String的substring(2)方法截取字符串后,后再进行转换,代码如下:
/**
* @Description: main测试方法
* @author Zack 2015年7月30日
* @param args
*/
public static void main(String[] args) {
String strString = "{\"status\":0}".substring(2);
net.sf.json.JSONObject obj = net.sf.json.JSONObject.fromObject(strString);
System.out.println("status=> " + obj.getString("status"));
}
问题得以解决!