JSON反序列化异常

来源:互联网 发布:mac os sierra正式版 编辑:程序博客网 时间:2024/04/28 17:19

出一题给大家:
正常情况:{"Areas":[{"Id":1,"Name":"\u5317\u4EAC"},{"Id":2,"Name":"\u4E0A\u6D77"},{"Id":3,"Name":"\u5929\u6D25"}],"Message":null}
异常情况:{"Areas":null,"Message":null}

目的拿到Areas里的数组,如果拿不到也不能抛异常

root.getJSONArray("Areas").isArray()

本来想这样解决的,可是还是抛出了如下异常,是正式环境抛出的异常
[http-8005-34] - 2013-08-07 10:41:18,093 - [ERROR] - com.opensymphony.xwork2.util.logging.commons.CommonsLogger.error(CommonsLogger.java:38) - JSONObject["Areas"] is not a JSONArray.net.sf.json.JSONException: JSONObject["Areas"] is not a JSONArray.at net.sf.json.JSONObject.getJSONArray(JSONObject.java:2119)

JSONObject jsonObj=root.getJSONObject("Areas");jsonObj.isEmpty();

这种是怎么都不行的,抛出了如下异常
2013-08-07 17:48:59 - [ERROR] - com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor - null objectnet.sf.json.JSONException: null object    at net.sf.json.JSONObject.verifyIsNull(JSONObject.java:2835)    at net.sf.json.JSONObject.isEmpty(JSONObject.java:2208)


JSONObject jsonObj=root.getJSONObject("Areas");jsonObj.isNullObject();

突然觉得,是不是应该这样呢?这样倒是对异常情况ok,对正常情况又会有下面的错误。。
2013-08-07 17:57:43 - [ERROR] - com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor - JSONObject["Areas"] is not a JSONObject.net.sf.json.JSONException: JSONObject["Areas"] is not a JSONObject.    at net.sf.json.JSONObject.getJSONObject(JSONObject.java:2139)


是否搞得黔驴技穷了?还有没有其他办法?
Object obj=root.get("Areas");
直接拿到这个对象呢,能有什么办法来判断?
结果Object没有JSONObject的方法,怎么办?
断点看结果吧,再一步一步来,isNullObject这个值是null,那用null判断来做?
obj==null,也有问题,这个获取的对象不为null,这样判断肯定不行。
obj.equals("null")试了下,这也是不行的?那真的没有办法了吗?
应该不是这样的,所以,继续冥想,总算找到了解决之道,也许不是最好的方式,但也是一种方式,所以提供出来给大家借鉴
if (!root.get("Areas").toString().equals("null")) {    JSONArray areas = root.getJSONArray("Areas");} 

然后正常逻辑就满足了,也不再抛异常了。

that's all