在使用Google的 Gson 类库解析 Json 数据时,难免会出现解析失败的情况。
在这种情况下,使用 if(obj == null) 是不可行的,fromJson 方法会自动生成对象的实例,所以这样返回的结果都是true,当然也可以用 if (obj.Field == null && ……)这种方法,但这并不是最好的选择,所以就有了遍历对象的想法,通过反射获取对象的所有属性名,再通过属性名称获取属性值,也就有了isAnalysisFile 这个方法。
反射获取对象所有属性名称 :
public static String[] getObjectAllFiledName(Object obj){ Field[] fields = obj.getClass().getDeclaredFields(); String[] fieldsNames = new String[fields.length]; for (int i = 0; i < fieldsNames.length; i++) { fieldsNames[i] = fields[i].getName(); } return fieldsNames; }
反射获取对象所有属性值,根据GET方法获取。
public static Object getFieldValueByName(String fieldName,Object obj) throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { String firstLetter = fieldName.substring(0, 1).toUpperCase(); String getter = "get" +firstLetter+ fieldName.substring(1); Method method = obj.getClass().getMethod(getter, new Class[] {}); Object valueArr = method.invoke(obj, new Object[] {}); return valueArr; }
遍历对象所有属性值,判断是否为NULL,一般情况下只会出现两种情况,NULL和FALSE。
因此只要有一个属性值为TRUE,直接返回结果,解析是成功的。
如果全部为NULL和FALE,那么判定为解析失败。
public static boolean isAnalysisFail(Object object){ String[] fields = getObjectAllFiledName(object); boolean flag = true; for (String string : fields) { try { Object obj = getFieldValueByName(string, object); if(obj == null) { flag = false; }else if(Boolean.parseBoolean(obj.toString())){ return true; }else { flag = true; } } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } return flag; }
使用 :
if (!Tools.isAnalysisFail(ipMaster)) { msg = handler.obtainMessage(); msg.what = -1; msg.obj = "送货单不存在"; handler.sendMessage(msg); }