• 封装 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);
                        }
    
     
    
     
  • 相关阅读:
    什么是Servlet?
    哪种情况下用哪种域对象
    相对于Statement,PreparedStatement的优点是什么?
    JDBC的PreparedStatement是什么?
    execute,executeQuery,executeUpdate的区别是什么?
    什么是JDBC,在上面时候会用到它?
    ArrayList、LinkedList、Vector 的区别。
    int 和 Integer 有什么区别
    Java 为每个原始类型提供了哪些包装类型
    什么是JDBC,在上面时候会用到它?
  • 原文地址:https://www.cnblogs.com/yangchaojie/p/9310333.html
Copyright © 2020-2023  润新知