Fastjson封装使用(二)

一、前言:

上一篇: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 convertJsonToObject(String json,Class 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 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  List convertJsonToObjectObjList(String json, Class clazz)
            throws Exception {
        return JSON.parseArray(json, clazz);
    }

    /**
     * 功能描述:把JSON数据转换成较为复杂的java对象列表
     * 
     * @param json
     *            JSON数据
     * @return
     * @throws Exception
     */
    public static List> convertJsonToObjectMapList(String json)
            throws Exception {
        return JSON.parseObject(json,
                new TypeReference>>() {
                });
    }


    /**
     * 将网络请求下来的数据用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  返回相应对象
     * @return
     */
    public static  T jsonToObject(String str,Class clazz) {
        return JSON.parseObject(str,clazz);
    }


    /**
     * json格式解析为List集合,不解决格式时间问题
     * @param str json字符串
     * @param clazz 要转换的对象
     * @param 
     * @return
     */
    public static  List jsonTolist(String str, Class 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 users = new ArrayList();
//必须用空参构造
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 UserList = new ArrayList();
                UserList.add(new User("小红","15618273672",27,"伯俊公司1"));
                UserList.add(new User("小亮","15618273677",25,"伯俊公司2"));
                UserList.add(new User("小涛","15618273676",24,"伯俊公司3"));


                List userGroupList = new ArrayList();
                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 UserList2 = new ArrayList();
                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 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 = new ArrayList();
  //必须有默认空参构造
    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 UserList = new ArrayList();
        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 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 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 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 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 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 地址:

  • https://github.com/lyyRunning/FastJsonDemo

你可能感兴趣的:(Fastjson封装使用(二))