美文网首页gson
Fastjson封装使用(二)

Fastjson封装使用(二)

作者: 因为我的心 | 来源:发表于2019-07-15 20:55 被阅读0次

    一、前言:

    上一篇:Fastjson使用(一):
    https://www.jianshu.com/p/807c6f8c68f0

    fastjson是阿里巴巴推出的json工具,号称是最快的。如果基本用法不会,请先看上一篇文章:

    今天,主要写一下封装的工具类,然后是数据解析这一块,我发现后台给我们的数据,有时候嵌套层级比较多,我们不好进行数据解析。看完本篇文章,不管多么深的层级,都能轻易的解析。

     //fastJson依赖
     compile 'com.alibaba:fastjson:1.2.55'
    

    二、工具类:

    1. JsonUtil类:(我喜欢用这个,演示用的是这个类)
    /**
     * Created by luo on 2019/7/15.
     * Json 工具类,支持各种数据类型转换(建议用这个)
     */
    
    public class JsonUtil {
        /***
         * object 转成json
         * @param root
         * @return
         */
        public static String convertObjectToJson(Object root) {
            
            String resutlString = "";
            try {
                resutlString = JSON.toJSONString(root);
                
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            return resutlString;
        }
        
        
        /***
         * json转成object
         * @param
         * @return
         */
        public static<T> T convertJsonToObject(String json,Class<T> clazz) {
            T readValue = null;
            try {   
                readValue = JSON.parseObject(json, clazz);
            } catch (Exception e) {
            }       
            
            return readValue;
        }
        
        
        
        /**
         * 功能描述:把JSON数据转换成普通字符串列表
         * 
         * @param jsonData
         *            JSON数据
         *
         * @return
         * @throws Exception
         *
         */
        public static List<String> convertJsonToObjectList(String jsonData) throws Exception {
            return JSON.parseArray(jsonData, String.class);
        }
    
        /**
         * 功能描述:把JSON数据转换成jsonObject
         * 
         * @param jsonData
         *            JSON数据
         * @return
         * @throws Exception
         * 
         */
        public static JSONObject convertJsonToObject(String jsonData) throws Exception {
            return JSON.parseObject(jsonData);
        }
    
        
        /**
         * 功能描述:把JSON数据转换成指定的java对象列表
         * 
         * @param json
         *            JSON数据
         * @param clazz
         *            指定的java对象
         * @return
         * @throws Exception
         */
        public static <T> List<T> convertJsonToObjectObjList(String json, Class<T> clazz)
                throws Exception {
            return JSON.parseArray(json, clazz);
        }
    
        /**
         * 功能描述:把JSON数据转换成较为复杂的java对象列表
         * 
         * @param json
         *            JSON数据
         * @return
         * @throws Exception
         */
        public static List<Map<String, Object>> convertJsonToObjectMapList(String json)
                throws Exception {
            return JSON.parseObject(json,
                    new TypeReference<List<Map<String, Object>>>() {
                    });
        }
    
    
        /**
         * 将网络请求下来的数据用fastjson处理空的情况,并将时间戳转化为标准时间格式
         * @param result
         * @return
         */
        public static String dealResponseResult(String result) {
            result = JSONObject.toJSONString(result,
                    SerializerFeature.WriteClassName,
                    SerializerFeature.WriteMapNullValue,
                    SerializerFeature.WriteNullBooleanAsFalse,
                    SerializerFeature.WriteNullListAsEmpty,
                    SerializerFeature.WriteNullNumberAsZero,
                    SerializerFeature.WriteNullStringAsEmpty,
                    SerializerFeature.WriteDateUseDateFormat,
                    SerializerFeature.WriteEnumUsingToString,
                    SerializerFeature.WriteSlashAsSpecial,
                    SerializerFeature.WriteTabAsSpecial);
            return result;
        }
    }
    
    1. JsonUtils类:
    /**
     * Created by luo on 2019/7/15.
     * Json 工具类,支持各种数据类型转换
     * 
     */
    
    public class JsonUtils {
    
    
        /**
         * 默认日期格式(年月日时分秒)
         */
        public static final String default_dateFormat = "yyyy-MM-dd HH:mm:ss";
        /**
         * 存在时间格式(年月日)
         */
        public static final String dateFormat = "yyyy-MM-dd";
    
        /**
         * json字符串转对象
         * @param str 字符串
         * @param clazz 需要转成想要的对象
         * @param <T> 返回相应对象
         * @return
         */
        public static <T> T jsonToObject(String str,Class<T> clazz) {
            return JSON.parseObject(str,clazz);
        }
    
    
        /**
         * json格式解析为List集合,不解决格式时间问题
         * @param str json字符串
         * @param clazz 要转换的对象
         * @param <T>
         * @return
         */
        public static <T> List<T> jsonTolist(String str, Class<T> clazz) {
    
            return JSON.parseArray(str,clazz);
        }
    
        /**
         * 对象转json字符串,默认不执行进行日期转换
         *
         * @param obj 对象
         * @return
         */
        public static String ObjectTojson(Object obj) {
    
            return ObjectTojson(obj, false);
        }
    
        /**
         * 对象转json字符串,使用默认日期转换
         *
         * @param obj 对象
         * @param useDateFormat 自定义时间格式
         * @return
         */
        public static String ObjectTojson(Object obj, boolean useDateFormat) {
    
            return ObjectTojson(obj, useDateFormat, default_dateFormat);
        }
    
        /**
         * 自定义日期格式
         * @param obj
         * @param dateFormat
         * @return
         */
        public static String ObjectTojson(Object obj, String dateFormat) {
    
            return ObjectTojson(obj, true, dateFormat);
    
        }
    
        /**
         * 对象转字符串,总处理方法,不对外开放
         * @param obj javabean对象
         * @param useDateFormat
         * @param dateFormat
         * @return
         */
        private static String ObjectTojson(Object obj, boolean useDateFormat, String dateFormat) {
            if (useDateFormat) {
                return JSON.toJSONStringWithDateFormat(obj, dateFormat);
            }
            return JSON.toJSONString(obj);
    
        }
        
    }
    

    三、使用:

    1. User类

    public class User implements Serializable {
    
        private String name;
        private String phone;
        private int age;
        private String company;
        //必须用空参构造
       public User() {
        }
    }
    

    2. UserGroup类

    public class UserGroup implements Serializable{

    private String name;
    private List<User> users = new ArrayList<User>();
    //必须用空参构造
    public UserGroup() {
    }
    

    }

    3. UserGroup类

    //初始化对象
    User user =  new User("小明","15618273672",27,"伯俊公司");
    
    @OnClick({R.id.btn_1, R.id.btn_2, R.id.btn_3, R.id.btn_4, R.id.btn_5, R.id.btn_6, R.id.btn_7})
        public void onViewClicked(View view) {
            switch (view.getId()) {
                case R.id.btn_1:
                    //对象转 Json 数据
                    String str =  JsonUtil.convertObjectToJson(user);
                    Log.d("LUO","======"+str);
                    //{"age":27,"company":"伯俊公司","name":"小明","phone":"15618273672"}
                    break;
                case R.id.btn_2:
                    String jsonString2 =  JsonUtil.convertObjectToJson(user);
                    //Json数据转对象
                    User user1 = JsonUtil.convertJsonToObject(jsonString2,User.class);
                    Log.d("LUO","======"+user1);
                    //com.function.luo.fastjsondemo.User@555d8c2
                    break;
                case R.id.btn_3:
                    List<User> UserList = new ArrayList<User>();
                    UserList.add(new User("小红","15618273672",27,"伯俊公司1"));
                    UserList.add(new User("小亮","15618273677",25,"伯俊公司2"));
                    UserList.add(new User("小涛","15618273676",24,"伯俊公司3"));
    
    
                    List<UserGroup> userGroupList = new ArrayList<UserGroup>();
                    userGroupList.add(new UserGroup("项目一",UserList));
                    userGroupList.add(new UserGroup("项目二",UserList));
                    userGroupList.add(new UserGroup("项目三",UserList));
                    //集合对象转 Json 数据
                    String jsonString3 =  JsonUtil.convertObjectToJson(userGroupList);
                    Log.d("LUO","======"+jsonString3);
                    //[{"name":"项目一","users":[{"age":27,"company":"伯俊公司1","name":"小红","phone":"15618273672"},{"age":25,"company":"伯俊公司2","name":"小亮","phone":"15618273677"},{"age":24,"company":"伯俊公司3","name":"小涛","phone":"15618273676"}]},{"name":"项目二","users":[{"$ref":"$[0].users[0]"},{"$ref":"$[0].users[1]"},{"$ref":"$[0].users[2]"}]},{"name":"项目三","users":[{"$ref":"$[0].users[0]"},{"$ref":"$[0].users[1]"},{"$ref":"$[0].users[2]"}]}]
    
                    break;
                case R.id.btn_4:
                    List<User> UserList2 = new ArrayList<User>();
                    UserList2.add(new User("小红","15618273672",27,"伯俊公司1"));
                    UserList2.add(new User("小亮","15618273677",25,"伯俊公司2"));
                    UserList2.add(new User("小涛","15618273676",24,"伯俊公司3"));
    
    
                    String jsonString4 =  JsonUtil.convertObjectToJson(UserList2);
    
                    //Json 数据转集合对象
                    List<User> UserList3 = null;
                    try {
                        UserList3 = JsonUtil.convertJsonToObjectObjList(jsonString4,User.class);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    Log.d("LUO","======"+UserList3);
                    //[com.function.luo.fastjsondemo.User@d12877d, com.function.luo.fastjsondemo.User@dd9f672, com.function.luo.fastjsondemo.User@d10dac3]
    
                    break;
                case R.id.btn_5:
                    try{
                        String str2 =   JsonUtil.convertObjectToJson(user);
                        //json 数据转对象
                        User user = JsonUtil.convertJsonToObject(str2,User.class);
                        Log.d("LUO","======"+user);
                        //com.function.luo.fastjsondemo.User@8c51e79
                    }catch (Exception e){
                        e.printStackTrace();
                    }
    
                    break;
                case R.id.btn_6:
                    //二层嵌套解析
                    parseData();
                    break;
                case R.id.btn_7:
                    //三层嵌套解析
                    parseData7();
                    break;
                default:
                    break;
            }
        }
    

    4. Animal类

    public class Animal implements Serializable{

    public String result;
    public String message;
    private Data data;
    //必须有默认空参构造
    public Animal() {
    } 
    

    }

    4. Animal类

    public class Animal implements Serializable{
    
        public String result;
        public String message;
        private Data data;
        //必须有默认空参构造
        public Animal() {
        } 
    }
    

    5. Data类

    public class Data implements Serializable{
        private int id;
        private String store;
        private List<Dog> dog = new ArrayList<Dog>();
      //必须有默认空参构造
        public Data() {
        }
    }
    

    6. Dog类

    public class Dog implements Serializable{
    
        private String name;
        private int age;
        private String address;
      //必须有默认空参构造
        public Dog() {
        }
     }
    

    7. 二层嵌套

    数据示例:

    二层嵌套数据.png

    代码示例:

      /**
         * 解析二层嵌套示例
         * @
         */
        private void parseData() {
    
            List<User> UserList = new ArrayList<User>();
            UserList.add(new User("小红","15618273672",27,"伯俊公司1"));
            UserList.add(new User("小亮","15618273677",25,"伯俊公司2"));
            UserList.add(new User("小涛","15618273676",24,"伯俊公司3"));
    
    
            UserGroup userGroup = new UserGroup("项目一",UserList);
            String jsonString = JsonUtils.ObjectTojson(userGroup);
            Log.d("LUO","======"+jsonString);
            //{"name":"项目一","users":[{"age":27,"company":"伯俊公司1","name":"小红","phone":"15618273672"},{"age":25,"company":"伯俊公司2","name":"小亮","phone":"15618273677"},{"age":24,"company":"伯俊公司3","name":"小涛","phone":"15618273676"}]}
    
    
            try {
                //转化为JSONObject对象
                JSONObject json = JsonUtil.convertJsonToObject(jsonString);
    
                //获取name 值
                String name = String.valueOf(json.get("name"));
                Log.d("LUO","name======"+name);
                //name======项目一
                //获取 users 集合的值
                List<User> userList = JsonUtil.convertJsonToObjectObjList(json.getJSONArray("users").toString(), User.class);
                Log.d("LUO","======"+userList);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    8. 三层嵌套

    数据示例:


    三层嵌套数据.png

    代码示例:

     /**
         * 多级嵌套网络请求
         */
        private void parseData7() {
    
            Animal animal = new Animal();
            Data data = new Data();
    
            List<Dog> dogList = new ArrayList<>();
            Dog dog1 = new Dog();
            dog1.setAddress("上海市,闵行625 号");
            dog1.setAge(8);
            dog1.setName("小狗 1");
    
            Dog dog2 = new Dog();
            dog2.setAddress("上海市,闵行626 号");
            dog2.setAge(9);
            dog2.setName("小狗 2");
    
            Dog dog3 = new Dog();
            dog3.setAddress("上海市,闵行625 号");
            dog3.setAge(6);
            dog3.setName("小狗 3");
    
            dogList.add(dog1);
            dogList.add(dog2);
            dogList.add(dog3);
            data.setDog(dogList);
            data.setStore("闵行店");
            data.setId(10);
    
            animal.setData(data);
            animal.setResult("200");
            animal.setMessage("请求成功");
    
    
    
            String jsonStr = JsonUtil.convertObjectToJson(animal);
            Log.d("LUO","======"+jsonStr);
            try {
                //{"data":{"dog":[{"address":"上海市,闵行625 号","age":8,"name":"小狗 1"},{"address":"上海市,闵行626 号","age":9,"name":"小狗 2"},{"address":"上海市,闵行625 号","age":6,"name":"小狗 3"}],"id":1,"store":"闵行店"},"message":"请求成功","result":"200"}
    
                JSONObject json =  JsonUtil.convertJsonToObject(jsonStr);
                //看清是值还是对象,值用get()或getIntValue(),对象用getJSONObject()
                //获取 result 值
                String result = (String) json.get("result");
                //获取 message 值
                String message = (String) json.get("message");
                //获取 data 下面的 id 值
                int id = json.getJSONObject("data").getIntValue("id");
                //获取 data 下面的 store 值
               String store = json.getJSONObject("data").getString("store");
                //获取 data 下面的 dog集合值(看清是集合还是对象,集合用getJSONArray(),对象用getJSONObject())
                List<Dog> dogList1 = JsonUtil.convertJsonToObjectObjList(json.getJSONObject("data").getJSONArray("dog").toString(), Dog.class);
    
                Log.d("LUO","result======"+result);
                // result======200
                Log.d("LUO","message======"+message);
                // message======请求成功
                Log.d("LUO","id======"+id);
                //id======10
                Log.d("LUO","store======"+store);
                //store======闵行店
                Log.d("LUO","======"+dogList1);
    
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    

    四、注意:

    1. 低版本中,如果JavaBean中没有默认构造函数(显式或默认),运行时将直接抛出 “default constructor not found” 的异常信息,如下:
    image.png
    1. 高版本中,反序列化时JSON会首先尝试调用默认构造函数,如果没有默认构造函数,则会寻找相匹配的有参构造函数。如果已经存在有参构造函数,但并没有提供默认构造函数时,某些场景下会出现反序列化的对象的属性值为空的情况,因此建议,JavaBean存在有参构造函数时,都显式提供默认构造函数。 GitHub上也有人提出了相同的问题,详见这里

    五、总结:

    1. JavaBean中必须写默认构造函数;
    2. 将对象转化为 Json 数据
     String str =  JsonUtil.convertObjectToJson(user);
    

    解释:将对象转化为 Json 数据

    1. Json数据转对象
     User user1 = JsonUtil.convertJsonToObject(jsonString2,User.class);
    

    解释:Json数据转对象

    1. 集合对象转 Json 数据
     String jsonString3 =  JsonUtil.convertObjectToJson(userGroupList);
    

    解释:集合对象转 Json 数据

    1. Json 数据转集合对象
     List<User> UserList3 = null;
     try {
        UserList3 = JsonUtil.convertJsonToObjectObjList(jsonString4,User.class);
         } catch (Exception e) {
            e.printStackTrace();
     }
    
    1. 转化为JSONObject对象
    JSONObject json = JsonUtil.convertJsonToObject(jsonString);
    

    注意:JSONObject就是一个对象,我们可以获取对象的属性,可以获取对象中的对象,也可以获取对象中的集合。

    1. 获取值:
    //获取name 值
    -  json.get()
    -  json.getString()
    - json.getBigInteger()
    - getDouble()
    - getFloat()
    - getIntValue()
    - getInteger()
    - getBoolean()
    
    1. 获取对象的值:
    - json.getJSONObject("data")
    
    //获取 data 对象下面的 id 值
    int id = json.getJSONObject("data").getIntValue("id");
    
    1. 获取对象下面的集合对象的值:
    - json.getJSONArray("users")
    
     //获取 users 集合的值
    List<User> userList = JsonUtil.convertJsonToObjectObjList(json.getJSONArray("users").toString(), User.class);
    
    1. JSONObject 集合
    JSONObject jsonObject = new JSONObject();
     try {
         jsonObject.put("pageNo", number);
         jsonObject.put("querySide", "1");
         jsonObject.put("pageSize", "15");
         jsonObject.put("userIdEnc", userIdEnc);
    
     } catch (JSONException e) {
        e.printStackTrace();
     }
    

    六、项目 gitHub 地址:

    相关文章

      网友评论

        本文标题:Fastjson封装使用(二)

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