一、前言:
上一篇:Fastjson使用(一):
https://www.jianshu.com/p/807c6f8c68f0
fastjson是阿里巴巴推出的json工具,号称是最快的。如果基本用法不会,请先看上一篇文章:
今天,主要写一下封装的工具类,然后是数据解析这一块,我发现后台给我们的数据,有时候嵌套层级比较多,我们不好进行数据解析。看完本篇文章,不管多么深的层级,都能轻易的解析。
//fastJson依赖
compile 'com.alibaba:fastjson:1.2.55'
二、工具类:
- 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
- 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. 二层嵌套
数据示例:
代码示例:
/**
* 解析二层嵌套示例
* @
*/
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. 三层嵌套
数据示例:
代码示例:
/**
* 多级嵌套网络请求
*/
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();
}
}
四、注意:
- 低版本中,如果JavaBean中没有默认构造函数(显式或默认),运行时将直接抛出 “default constructor not found” 的异常信息,如下:
- 高版本中,反序列化时JSON会首先尝试调用默认构造函数,如果没有默认构造函数,则会寻找相匹配的有参构造函数。如果已经存在有参构造函数,但并没有提供默认构造函数时,某些场景下会出现反序列化的对象的属性值为空的情况,因此建议,JavaBean存在有参构造函数时,都显式提供默认构造函数。 GitHub上也有人提出了相同的问题,详见这里
五、总结:
- JavaBean中必须写默认构造函数;
- 将对象转化为 Json 数据
String str = JsonUtil.convertObjectToJson(user);
解释:将对象转化为 Json 数据
- Json数据转对象
User user1 = JsonUtil.convertJsonToObject(jsonString2,User.class);
解释:Json数据转对象
- 集合对象转 Json 数据
String jsonString3 = JsonUtil.convertObjectToJson(userGroupList);
解释:集合对象转 Json 数据
- Json 数据转集合对象
List UserList3 = null;
try {
UserList3 = JsonUtil.convertJsonToObjectObjList(jsonString4,User.class);
} catch (Exception e) {
e.printStackTrace();
}
- 转化为JSONObject对象
JSONObject json = JsonUtil.convertJsonToObject(jsonString);
注意:JSONObject就是一个对象,我们可以获取对象的属性,可以获取对象中的对象,也可以获取对象中的集合。
- 获取值:
//获取name 值
- json.get()
- json.getString()
- json.getBigInteger()
- getDouble()
- getFloat()
- getIntValue()
- getInteger()
- getBoolean()
- 获取对象的值:
- json.getJSONObject("data")
//获取 data 对象下面的 id 值
int id = json.getJSONObject("data").getIntValue("id");
- 获取对象下面的集合对象的值:
- json.getJSONArray("users")
//获取 users 集合的值
List userList = JsonUtil.convertJsonToObjectObjList(json.getJSONArray("users").toString(), User.class);
- 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