封装 Gson 解析Json到对象是否失败

在使用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);
                    }

 

 

 

 

posted @ 2018-07-14 17:36  杨超杰  阅读(1161)  评论(0编辑  收藏  举报