json字符串转换为复杂对象

json字符串转换为指定对象

通常我们使用的JSONObject将json字符串转为对象,只能建立在该对象内没有没有引用类型和数据的情况下才可以进行转换的,在面对复杂的对象时候转换会报错。在这里就教你怎么将json转为复杂数据类型。这里是通过JSONObject对象和反射进行操作的。有什么更好的方法可以教一下我。哈哈哈`

第一步导入JSONObject包

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>${fastjson.version}</version>
</dependency>

第二步创建一个静态方法

/**
*
* @param json json字符串或者是JSONObject
* @param type Class对象 列如Student.class
* @return 返回值是 Student实例
* @throws Exception
*/

 public static Object jsonToBean(Object json, Object type) throws Exception {
        JSONObject jsonObject=null;
        //首先需要判断是否是json字符串如果是解析为jsonObject如果是JsonObject就直接赋值给jsonObject
        if (json instanceof String){
            //将json转为JSONOject
            jsonObject=JSONObject.parseObject(json.toString());
        }else {
            jsonObject= (JSONObject) json;
        }
        //获得Class对象
        //Class clazz=type.getClass().getDeclaringClass();
        Class clazz= (Class) type;
        //通过空参构造器创建实例
        Constructor constructor = clazz.getDeclaredConstructor();
        constructor.setAccessible(true);
        Object classObject =  constructor.newInstance();
        //获得对象的所有属性名
        Field[] fields = clazz.getDeclaredFields();
        //遍历属性集合
        for (int i=0;i<fields.length;i++){
            Field field=fields[i];
            //开启权限
            field.setAccessible(true);
            //判断是否保护属性值
            if(jsonObject.containsKey(field.getName())){
                Object objectValue =jsonObject.get(field.getName());
                //判断jsonObject的item是否是String或者Integer、Boolean,是简单类型直接赋值
                if ((objectValue instanceof String)||(objectValue instanceof Integer)||(objectValue instanceof Boolean)){
                    field.set(classObject,objectValue);
                }
                //集合类型类型
                else if(objectValue instanceof JSONArray){
                    Iterator<Object> iterator = ((JSONArray) objectValue).iterator();
                    //这里使用的是arryList接收
                    List list=new ArrayList<>();
                    // 如果是List类型,得到其Generic的类型
                    Type genericType = field.getGenericType();
                    //如果是空的
                    if(genericType == null) {
                        genericType=Object.class;
                    }
                    // 如果是泛型参数的类型
                    else if(genericType instanceof ParameterizedType){
                        ParameterizedType pt = (ParameterizedType) genericType;
                        //得到泛型里的class类型对象
                        Class<?> genericClazz = (Class<?>)pt.getActualTypeArguments()[0];
                        genericType=genericClazz;
                    }
                    while (iterator.hasNext()){
                        Object nextObject = iterator.next();
                        Object fieldValue =  jsonToBean(nextObject, genericType);
                        list.add(fieldValue);
                    }
                    field.set(classObject,list);
                }
                //如果不是再判断是否是JSONOArray,复杂数据类型
                else{
                    //如果是JSONObject需要判断是否是引用类型,如果是引用类型就还需要将值转为对应类型
                    Object fieldValue =  jsonToBean(objectValue, field.getType());
                    field.set(classObject,fieldValue);
                }
            }
        }

        return classObject;
    }