美文网首页Android技术知识Android开发
Android-泛型转对象,泛型转对象List

Android-泛型转对象,泛型转对象List

作者: h_f | 来源:发表于2019-08-05 17:40 被阅读12次

    一、json转对象:
    应用场景:接口中一个数据可能为对象,也可能是一个对象List(此处其实接口规范后,完全用不到下边的方法,没办法,一下方法就是想试试能不能适配这个情况)

    public class HttpBeen<T>  implements Serializable{
        private String result;
        private String errorCode;
        private T ResultData;
    
    }
    

    对象中采用<T>泛型修饰。以下是将泛型转换为对象的方法:

    /** 对象类型转换
         * @param obj  源对象
         * @param cla  目标对象类型
         * @param <T>  泛型
         * @return     目标对象
         */
        public static  <T> T jsonToBean(LinkedTreeMap obj,Class<T> cla) {
            T  dataBean = null;
            try {
                if(null==obj) {
                    return null;
                }
                dataBean = cla.newInstance();
                Field[] beanFields = cla.getDeclaredFields();
                //通过set方法给目标对象赋值
                for(Field field:beanFields){
                    if (field.getModifiers() == 26) continue;
                    field.setAccessible(true);
                    String fieldName = field.getName();
                    Class<?> fieldType = field.getType();
                    String fieldValue = obj.get(fieldName)==null?null:obj.get(fieldName).toString();
                    if(fieldValue!=null){
                        try {
                            if(String.class.equals(fieldType)){
                                field.set(dataBean, fieldValue);
                            }else if(byte.class.equals(fieldType)){
                                field.setByte(dataBean, Byte.parseByte(fieldValue));
    
                            }else if(Byte.class.equals(fieldType)){
                                field.set(dataBean, Byte.valueOf(fieldValue));
    
                            }else if(boolean.class.equals(fieldType)){
                                field.setBoolean(dataBean, Boolean.parseBoolean(fieldValue));
    
                            }else if(Boolean.class.equals(fieldType)){
                                field.set(dataBean, Boolean.valueOf(fieldValue));
    
                            }else if(short.class.equals(fieldType)){
                                field.setShort(dataBean, Short.parseShort(fieldValue));
    
                            }else if(Short.class.equals(fieldType)){
                                field.set(dataBean, Short.valueOf(fieldValue));
    
                            }else if(int.class.equals(fieldType)){
                                field.setInt(dataBean, Integer.parseInt(fieldValue));
    
                            }else if(Integer.class.equals(fieldType)){
                                field.set(dataBean, Integer.valueOf(fieldValue));
    
                            }else if(long.class.equals(fieldType)){
                                field.setLong(dataBean, Long.parseLong(fieldValue));
    
                            }else if(Long.class.equals(fieldType)){
                                field.set(dataBean, Long.valueOf(fieldValue));
    
                            }else if(float.class.equals(fieldType)){
                                field.setFloat(dataBean, Float.parseFloat(fieldValue));
    
                            }else if(Float.class.equals(fieldType)){
                                field.set(dataBean, Float.valueOf(fieldValue));
    
                            }else if(double.class.equals(fieldType)){
                                field.setDouble(dataBean, Double.parseDouble(fieldValue));
    
                            }else if(Double.class.equals(fieldType)){
                                field.set(dataBean, Double.valueOf(fieldValue));
    
                            }else if(Date.class.equals(fieldType)){
                                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
                                field.set(dataBean, sdf.parse(fieldValue));
                            }
                        } catch (IllegalArgumentException e) {
    //                        e.printStackTrace();
                            return null;
                        } catch (ParseException e) {
    //                        e.printStackTrace();
                            return null;
                        }
    
                    }
                }
    
            } catch (Exception e) {
                return null;
    //            e.printStackTrace();
            }
            return dataBean;
        }
    

    此处LinkedTreeMap的原因是项目采用Retrofit+OKHttp的方式网络框架,Gson解析,泛型情况下Gson会将格式擦除,转换为LinkedTreeMap。

    二、json转对象List:

    /**
         * 对象数组类型转换
         * @param json  源对象
         * @param clas  目标对象类型
         * @param <T>  泛型
         * @return  目标对象
         */
        public static <T> List<T> jsonToBeanList(String json, Type clas) {
            Gson gson = new Gson();
            List<T> list = new ArrayList<>();
            JsonParser parser = new JsonParser();
            JsonArray jsonarray = parser.parse(json).getAsJsonArray();
            for (JsonElement element : jsonarray) {
                list.add(gson.fromJson(element, clas));
            }
            return list;
        }
    

    这个没啥说的,自己百度看解析吧。
    以上方法借鉴了一些大神的方法思路

    相关文章

      网友评论

        本文标题:Android-泛型转对象,泛型转对象List

        本文链接:https://www.haomeiwen.com/subject/omamdctx.html