在通过json进行系统间数据交互开发的过程中,遇到了一个问题:页面解析JSONObject的时候,会出现null object的异常,抛出该异常的原因是,系统间交互的json字符串中出现了“:null”,这是这个原因的罪魁祸首。根据这个问题,在网上找了些资料,大多数的解决办法都是将“:null”替换为空字符串,如下:
网上普遍答案:
-------------------------------------------------------------------------------------------------
String result = CommonUtil.send(path+url, method,o);
result = result.replaceAll(":null", ":\"\"");
-------------------------------------------------------------------------------------------------
使用这个方法欠缺考虑的是,当出现“:null”的时候,无论原先数据为什么类型,都将会被替换为空字符串(String类型),这样在进行具体的业务逻辑处理的时候,需要加大量的特殊判断以及类型转换,以应对不同类型变化,因此不建议使用该方法。
在这里本人给出两个针对该问题的解决方法:
一:通过org.json.simple提供的JSONValue异常处理解决,如下:
try {
/*当接受到的json参数中出现“:null”的情况时,在进行字符串转换为JSONObject对象之后,
页面上对该JSONObject进行解析时会出现null object的问题,
如下:str为接受到的json字符串,将str转换为JSONObject对象,并将该JSONObject对象直接通过mvc传送到jsp页面,
这样jsp页面会出现null object异常错误*/
String str="{'sendguid':null,'receiveguid':'2121', 'obj_id':'sdsd', 'endpoint':'fgg', 'lineIDs':'fgfgh'}";
JSONObject jsonResult = JSONObject.fromObject(str);
/*加入这个异常处理之后,null object异常得到解决*/
//JSONValue.parseWithException(jsonResult.toString());
} catch (Exception e) {
// TODO: handle exception
}
该方法的优点为,避免了将“:null”转换成为空字符串类型。
二:通过反序列化对JSON字符串进行解析为MAP对象之后进行处理,如下:(import flexjson.JSONDeserializer;)
String str="{'sendguid':null,'receiveguid':'2121', 'obj_id':'sdsd', 'endpoint':'fgg', 'lineIDs':'fgfgh'}";
Map<String, String> paramMap = (Map<String, String>) new JSONDeserializer<Map<String, String>>()
.deserialize(str);
String p_sender=paramMap.get("sendguid");
String p_guid=paramMap.get("receiveguid");
String p_funcname=paramMap.get("funcname");
String p_obj_id=paramMap.get("obj_id");
String p_endpoint=paramMap.get("endpoint");
String p_lineIDs=paramMap.get("lineIDs");
logger.info("p_sender:"+p_sender);
logger.info("p_guid:"+p_guid);
logger.info("p_funcname:"+p_funcname);
logger.info("p_obj_id:"+p_obj_id);
logger.info("p_endpoint:"+p_endpoint);
logger.info("p_lineIDs:"+p_lineIDs);
将json字符串直接转换为MAP对象,避免出现页面直接解析JSONObject时出现的null object的错误。
以上资料为本人个人开发经验总结得来,发表出来与大家相互交流学习!如果有什么问题或者有更好的解决方法,也请大家积极留言,相互讨论!