一嚷堡、前言:
上一篇:Fastjson使用(一):
http://www.reibang.com/p/807c6f8c68f0
fastjson是阿里巴巴推出的json工具蝌戒,號(hào)稱是最快的。如果基本用法不會(huì)桩匪,請(qǐng)先看上一篇文章:
今天傻昙,主要寫一下封裝的工具類屋匕,然后是數(shù)據(jù)解析這一塊,我發(fā)現(xiàn)后臺(tái)給我們的數(shù)據(jù)蔗衡,有時(shí)候嵌套層級(jí)比較多绞惦,我們不好進(jìn)行數(shù)據(jù)解析洋措。看完本篇文章贺嫂,不管多么深的層級(jí)第喳,都能輕易的解析曲饱。
//fastJson依賴
compile 'com.alibaba:fastjson:1.2.55'
二扩淀、工具類:
- JsonUtil類:(我喜歡用這個(gè)引矩,演示用的是這個(gè)類)
/**
* Created by luo on 2019/7/15.
* Json 工具類旺韭,支持各種數(shù)據(jù)類型轉(zhuǎn)換(建議用這個(gè))
*/
public class JsonUtil {
/***
* object 轉(zhuǎn)成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轉(zhuǎn)成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數(shù)據(jù)轉(zhuǎn)換成普通字符串列表
*
* @param jsonData
* JSON數(shù)據(jù)
*
* @return
* @throws Exception
*
*/
public static List<String> convertJsonToObjectList(String jsonData) throws Exception {
return JSON.parseArray(jsonData, String.class);
}
/**
* 功能描述:把JSON數(shù)據(jù)轉(zhuǎn)換成jsonObject
*
* @param jsonData
* JSON數(shù)據(jù)
* @return
* @throws Exception
*
*/
public static JSONObject convertJsonToObject(String jsonData) throws Exception {
return JSON.parseObject(jsonData);
}
/**
* 功能描述:把JSON數(shù)據(jù)轉(zhuǎn)換成指定的java對(duì)象列表
*
* @param json
* JSON數(shù)據(jù)
* @param clazz
* 指定的java對(duì)象
* @return
* @throws Exception
*/
public static <T> List<T> convertJsonToObjectObjList(String json, Class<T> clazz)
throws Exception {
return JSON.parseArray(json, clazz);
}
/**
* 功能描述:把JSON數(shù)據(jù)轉(zhuǎn)換成較為復(fù)雜的java對(duì)象列表
*
* @param json
* JSON數(shù)據(jù)
* @return
* @throws Exception
*/
public static List<Map<String, Object>> convertJsonToObjectMapList(String json)
throws Exception {
return JSON.parseObject(json,
new TypeReference<List<Map<String, Object>>>() {
});
}
/**
* 將網(wǎng)絡(luò)請(qǐng)求下來(lái)的數(shù)據(jù)用fastjson處理空的情況,并將時(shí)間戳轉(zhuǎn)化為標(biāo)準(zhǔn)時(shí)間格式
* @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;
}
}
- JsonUtils類:
/**
* Created by luo on 2019/7/15.
* Json 工具類,支持各種數(shù)據(jù)類型轉(zhuǎn)換
*
*/
public class JsonUtils {
/**
* 默認(rèn)日期格式(年月日時(shí)分秒)
*/
public static final String default_dateFormat = "yyyy-MM-dd HH:mm:ss";
/**
* 存在時(shí)間格式(年月日)
*/
public static final String dateFormat = "yyyy-MM-dd";
/**
* json字符串轉(zhuǎn)對(duì)象
* @param str 字符串
* @param clazz 需要轉(zhuǎn)成想要的對(duì)象
* @param <T> 返回相應(yīng)對(duì)象
* @return
*/
public static <T> T jsonToObject(String str,Class<T> clazz) {
return JSON.parseObject(str,clazz);
}
/**
* json格式解析為L(zhǎng)ist集合沥邻,不解決格式時(shí)間問題
* @param str json字符串
* @param clazz 要轉(zhuǎn)換的對(duì)象
* @param <T>
* @return
*/
public static <T> List<T> jsonTolist(String str, Class<T> clazz) {
return JSON.parseArray(str,clazz);
}
/**
* 對(duì)象轉(zhuǎn)json字符串唐全,默認(rèn)不執(zhí)行進(jìn)行日期轉(zhuǎn)換
*
* @param obj 對(duì)象
* @return
*/
public static String ObjectTojson(Object obj) {
return ObjectTojson(obj, false);
}
/**
* 對(duì)象轉(zhuǎn)json字符串邮利,使用默認(rèn)日期轉(zhuǎn)換
*
* @param obj 對(duì)象
* @param useDateFormat 自定義時(shí)間格式
* @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);
}
/**
* 對(duì)象轉(zhuǎn)字符串延届,總處理方法方庭,不對(duì)外開放
* @param obj javabean對(duì)象
* @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;
//必須用空參構(gòu)造
public User() {
}
}
2. UserGroup類
public class UserGroup implements Serializable{
private String name;
private List<User> users = new ArrayList<User>();
//必須用空參構(gòu)造
public UserGroup() {
}
}
3. UserGroup類
//初始化對(duì)象
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:
//對(duì)象轉(zhuǎn) Json 數(shù)據(jù)
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數(shù)據(jù)轉(zhuǎn)對(duì)象
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("項(xiàng)目一",UserList));
userGroupList.add(new UserGroup("項(xiàng)目二",UserList));
userGroupList.add(new UserGroup("項(xiàng)目三",UserList));
//集合對(duì)象轉(zhuǎn) Json 數(shù)據(jù)
String jsonString3 = JsonUtil.convertObjectToJson(userGroupList);
Log.d("LUO","======"+jsonString3);
//[{"name":"項(xiàng)目一","users":[{"age":27,"company":"伯俊公司1","name":"小紅","phone":"15618273672"},{"age":25,"company":"伯俊公司2","name":"小亮","phone":"15618273677"},{"age":24,"company":"伯俊公司3","name":"小濤","phone":"15618273676"}]},{"name":"項(xiàng)目二","users":[{"$ref":"$[0].users[0]"},{"$ref":"$[0].users[1]"},{"$ref":"$[0].users[2]"}]},{"name":"項(xiàng)目三","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 數(shù)據(jù)轉(zhuǎn)集合對(duì)象
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 數(shù)據(jù)轉(zhuǎn)對(duì)象
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;
//必須有默認(rèn)空參構(gòu)造
public Animal() {
}
}
4. Animal類
public class Animal implements Serializable{
public String result;
public String message;
private Data data;
//必須有默認(rèn)空參構(gòu)造
public Animal() {
}
}
5. Data類
public class Data implements Serializable{
private int id;
private String store;
private List<Dog> dog = new ArrayList<Dog>();
//必須有默認(rèn)空參構(gòu)造
public Data() {
}
}
6. Dog類
public class Dog implements Serializable{
private String name;
private int age;
private String address;
//必須有默認(rèn)空參構(gòu)造
public Dog() {
}
}
7. 二層嵌套
數(shù)據(jù)示例:
二層嵌套數(shù)據(jù).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("項(xiàng)目一",UserList);
String jsonString = JsonUtils.ObjectTojson(userGroup);
Log.d("LUO","======"+jsonString);
//{"name":"項(xiàng)目一","users":[{"age":27,"company":"伯俊公司1","name":"小紅","phone":"15618273672"},{"age":25,"company":"伯俊公司2","name":"小亮","phone":"15618273677"},{"age":24,"company":"伯俊公司3","name":"小濤","phone":"15618273676"}]}
try {
//轉(zhuǎn)化為JSONObject對(duì)象
JSONObject json = JsonUtil.convertJsonToObject(jsonString);
//獲取name 值
String name = String.valueOf(json.get("name"));
Log.d("LUO","name======"+name);
//name======項(xiàng)目一
//獲取 users 集合的值
List<User> userList = JsonUtil.convertJsonToObjectObjList(json.getJSONArray("users").toString(), User.class);
Log.d("LUO","======"+userList);
} catch (Exception e) {
e.printStackTrace();
}
}
8. 三層嵌套
數(shù)據(jù)示例:
三層嵌套數(shù)據(jù).png
代碼示例:
/**
* 多級(jí)嵌套網(wǎng)絡(luò)請(qǐng)求
*/
private void parseData7() {
Animal animal = new Animal();
Data data = new Data();
List<Dog> dogList = new ArrayList<>();
Dog dog1 = new Dog();
dog1.setAddress("上海市,閔行625 號(hào)");
dog1.setAge(8);
dog1.setName("小狗 1");
Dog dog2 = new Dog();
dog2.setAddress("上海市,閔行626 號(hào)");
dog2.setAge(9);
dog2.setName("小狗 2");
Dog dog3 = new Dog();
dog3.setAddress("上海市圃阳,閔行625 號(hào)");
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("請(qǐng)求成功");
String jsonStr = JsonUtil.convertObjectToJson(animal);
Log.d("LUO","======"+jsonStr);
try {
//{"data":{"dog":[{"address":"上海市褐耳,閔行625 號(hào)","age":8,"name":"小狗 1"},{"address":"上海市,閔行626 號(hào)","age":9,"name":"小狗 2"},{"address":"上海市,閔行625 號(hào)","age":6,"name":"小狗 3"}],"id":1,"store":"閔行店"},"message":"請(qǐng)求成功","result":"200"}
JSONObject json = JsonUtil.convertJsonToObject(jsonStr);
//看清是值還是對(duì)象,值用get()或getIntValue()寄纵,對(duì)象用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集合值(看清是集合還是對(duì)象,集合用getJSONArray()脖苏,對(duì)象用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======請(qǐng)求成功
Log.d("LUO","id======"+id);
//id======10
Log.d("LUO","store======"+store);
//store======閔行店
Log.d("LUO","======"+dogList1);
} catch (Exception e) {
e.printStackTrace();
}
}
四程拭、注意:
- 低版本中,如果JavaBean中沒有默認(rèn)構(gòu)造函數(shù)(顯式或默認(rèn))棍潘,運(yùn)行時(shí)將直接拋出 “default constructor not found” 的異常信息恃鞋,如下:
image.png
- 高版本中,反序列化時(shí)JSON會(huì)首先嘗試調(diào)用默認(rèn)構(gòu)造函數(shù)亦歉,如果沒有默認(rèn)構(gòu)造函數(shù)恤浪,則會(huì)尋找相匹配的有參構(gòu)造函數(shù)。如果已經(jīng)存在有參構(gòu)造函數(shù)肴楷,但并沒有提供默認(rèn)構(gòu)造函數(shù)時(shí)水由,某些場(chǎng)景下會(huì)出現(xiàn)反序列化的對(duì)象的屬性值為空的情況,因此建議赛蔫,JavaBean存在有參構(gòu)造函數(shù)時(shí)砂客,都顯式提供默認(rèn)構(gòu)造函數(shù)。 GitHub上也有人提出了相同的問題呵恢,詳見這里
五鞠值、總結(jié):
- JavaBean中必須寫默認(rèn)構(gòu)造函數(shù);
- 將對(duì)象轉(zhuǎn)化為 Json 數(shù)據(jù)
String str = JsonUtil.convertObjectToJson(user);
解釋:將對(duì)象轉(zhuǎn)化為 Json 數(shù)據(jù)
- Json數(shù)據(jù)轉(zhuǎn)對(duì)象
User user1 = JsonUtil.convertJsonToObject(jsonString2,User.class);
解釋:Json數(shù)據(jù)轉(zhuǎn)對(duì)象
- 集合對(duì)象轉(zhuǎn) Json 數(shù)據(jù)
String jsonString3 = JsonUtil.convertObjectToJson(userGroupList);
解釋:集合對(duì)象轉(zhuǎn) Json 數(shù)據(jù)
- Json 數(shù)據(jù)轉(zhuǎn)集合對(duì)象
List<User> UserList3 = null;
try {
UserList3 = JsonUtil.convertJsonToObjectObjList(jsonString4,User.class);
} catch (Exception e) {
e.printStackTrace();
}
- 轉(zhuǎn)化為JSONObject對(duì)象
JSONObject json = JsonUtil.convertJsonToObject(jsonString);
注意:JSONObject就是一個(gè)對(duì)象渗钉,我們可以獲取對(duì)象的屬性彤恶,可以獲取對(duì)象中的對(duì)象,也可以獲取對(duì)象中的集合晌姚。
- 獲取值:
//獲取name 值
- json.get()
- json.getString()
- json.getBigInteger()
- getDouble()
- getFloat()
- getIntValue()
- getInteger()
- getBoolean()
- 獲取對(duì)象的值:
- json.getJSONObject("data")
//獲取 data 對(duì)象下面的 id 值
int id = json.getJSONObject("data").getIntValue("id");
- 獲取對(duì)象下面的集合對(duì)象的值:
- json.getJSONArray("users")
//獲取 users 集合的值
List<User> 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();
}