LZ-Says:技术,真的是日积月累,厚积薄发~
前言
目前解析json的方法有很多种,LZ个人认为使用Gson还是一种很不错的选择,因为使用Gson时,我们只需要考虑将json中参数和实体类属性一一对应即可,那么就以下面json数据为大家说明使用Gson解析Json所需实体类的那些事~
示例Json
{
"statusCode": 1100,
"message": "获取成功",
"data": [
{
"pname": "赵怡",
"idcard": "228",
"checkType": 1,
"calendar": "2017-02-06 16:26:26",
"recordId": 405,
"roomName": "白白",
"checkInStartTime": "2017-02-06 15:02:16",
"checkInDescript": "登记"
},
{
"pname": "赵标",
"idcard": "1302",
"checkType": 1,
"calendar": "2017-02-06 16:26:26",
"recordId": 403,
"roomName": "红红",
"checkInStartTime": "2017-02-06 14:42:34",
"checkInDescript": "登记"
}
]
}
如上Json包含三个参数,分别为statusCode(响应码),message(响应码对应消息内容),data(数据),其中data为List。
而且项目中规定接口返回数据格式都是以:响应码,响应码对应内容,数据为主。
根据上面简单分析,我们开始动手写实体类:
public class HttpClassBean{
public int statusCode;
public String message;
public List<ClassBean> data;
}
实体类写法演变
data类型也许会是多个,那么让我们一起看看,怎么写,才比较顺手?
一开始,我们都是这样写:
一开始,我们有多少写多少
public class HttpGreadBean{
public int statusCode;
public String message;
public List<GreadBean> data;
}
。。。
也就是有多少类型就写多少个实体类,而且重要的是,要重复写n次code,messag。那么这时候,有人会说了,单独将code,message提取出去,其他相关实体类继承一下不就得了?也对,这就是我们第二种方式。
之后,我们把重复属性字段提取出来
public class HttpBean{
public int statusCode;
public String message;
}
public class HttpClassBean extends HttpBean{
public List<HttpClassBean> data;
}
不满各位,LZ也是一直这么干的,但是今天又发现一种写法,我们只需要编写底层实体类,也就是List<这个类型>的实体类。
最后,只需要关注类型实体类即可
将原有HttpBean修改如下:
public class HttpBean<T> {
public int statusCode;
public String message;
public List<T> data;
}
现在,我们只需要关注T即可。那么该怎么通过Gson解析json呢?
我们接着往下瞧~
通过Gson解析json(根据第三种实体类编写而解析)
package com.example.gsonjsonstudy;
import java.lang.reflect.Type;
import android.app.Activity;
import android.os.Bundle;
import com.example.gsonjsonstudy.entity.PeopleBean;
import com.example.gsonjsonstudy.httpbean.HttpBean;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class MainActivity extends Activity {
private static final String json = "{\"statusCode\":1100,\"message\":\"获取成功\",\"data\":[{\"pname\":\"赵怡\",\"idcard\":\"228\",\"checkType\":1,\"calendar\":\"2017-02-06 16:26:26\",\"recordId\":405,\"roomName\":\"白白\",\"checkInStartTime\":\"2017-02-06 15:02:16\",\"checkInDescript\":\"登记\"},{\"pname\":\"赵标\",\"idcard\":\"112\",\"checkType\":1,\"calendar\":\"2017-02-06 16:26:26\",\"recordId\":403,\"roomName\":\"红红\",\"checkInStartTime\":\"2017-02-06 14:42:34\",\"checkInDescript\":\"登记\"}]}";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
gsonToJsonStudy();
}
private void gsonToJsonStudy() {
Gson gson = new Gson();
//指定T的类型
Type userType = (Type) new TypeToken<HttpBean<PeopleBean>>(){}.getType();
HttpBean<PeopleBean> peoResult = gson.fromJson(json, userType);
//获取第一个对象
PeopleBean bean = peoResult.data.get(0);
}
}
DeBug截图呈上~
1.指定T类型
2.获取第一个对象信息
结束
到目前为止,已简单为大家介绍三种写法,个人推荐使用第三种,当然有更好的写法欢迎大家和我分享~