zoukankan      html  css  js  c++  java
  • 封装 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);
                        }
    
     
    
     
  • 相关阅读:
    oracle 中有数据但是sql查询不出来结果(中文)
    linux mac 命令行 远程连接ssh提示IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY解决
    各地图坐标系知识及其转换方法
    Arcgis更新sde库许可
    运营商的三大数据域——B域,O域,M域
    SQL语句大全,所有的SQL都在这里
    苹果手机开启热点后,电脑搜索不到
    ArcgisServer在Linux系统上更新许可
    Linux 查询文件内容重复数 uniq、sort命令
    Atom 配置 Python
  • 原文地址:https://www.cnblogs.com/yangchaojie/p/9310333.html
Copyright © 2011-2022 走看看