背景:有一天,app线上版本的页面有些字段没有展示出来,O说,这种情况为什么没有报警!
需求:APP监控服务端返回的数据字段是否为空,有空字段则触发报警。
技术实现:在实现api监控的前提下,在保存监控数据的位置,遍历每一个key值对应的value,判断是否为空。
/** * 检查接口返回的数据是否有字段值为空 * @param jsonStr 服务端返回的mapData/data的json窜 * @return 有值为空返回904,正常则返回200 */ public static int checkValueIsEmpty(String jsonStr){ if(TextUtils.isEmpty(jsonStr)){ //为空直接返回904 return Constant.CODE_904; } JSONObject jsonObject = null; try { jsonObject = new JSONObject(jsonStr); } catch (JSONException e) { e.printStackTrace(); return Constant.CODE_200; } Iterator<String> keys = jsonObject.keys(); while (keys.hasNext()) { String strTemp = keys.next(); try { //根据key取出对应的value String value = jsonObject.getString(strTemp); if(TextUtils.isEmpty(value)){ //为空直接返回904 return Constant.CODE_904; } //检查取出的value是jsonObject还是jsonArray或者是变量 switch (checkIsObjectOrArray(value)){ case 1://array,继续遍历array所属的对象中的字段 JSONArray jsonArray = new JSONArray(value); for(int i=0;i<jsonArray.length();i++){ //继续遍历此数组中每个对象的属性是否为空 if(checkValueIsEmpty(jsonArray.get(i).toString())==Constant.CODE_904){ return Constant.CODE_904; } } break; case 2://object,继续遍历object中的字段 if(checkValueIsEmpty(value)==Constant.CODE_904){ return Constant.CODE_904; } break; case 3://正常变量 //继续检查下一个key值对应的value continue; }} catch (JSONException e) { e.printStackTrace(); return Constant.CODE_200; } } return Constant.CODE_200; } /** * 检查此json是Object还是JsonArray * @param str * @return 1:array ,2:object ,3:字符 ,904:字段为空code */ private static int checkIsObjectOrArray(String str) { try { JSONArray array = new JSONArray(str); return 1; } catch (JSONException e) {// 不是Array,继续判断是不是Object try { JSONObject object = new JSONObject(str); return 2; } catch (JSONException e2) {// 不是Array,也不是Object return 3; } } }