1、什么是Json对象、什么是Json数组?
{
"code": 200,
"ok": true,
"msg": "成功",
"body": { //返回的body这里是“{”的就是Json对象
"name": "xinjing",
"age": "18"
}
}
{
"code": 200,
"ok": true,
"msg": "成功",
"body": [ //这里是"["的就是json数组,每一个{}包含一个json对象
{
"name": "xinjing",
"age": "18"
},
{
"name": "xin",
"age": "16"
}
]
}
2、解析Json对象
第一步:新建返回josn数据结构对应的Bean类
public class Response<T> {
public int code;
public boolean ok;
public String msg;
public T body; //注意这里!!!!
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public boolean isOk() {
return ok;
}
public void setOk(boolean ok) {
this.ok = ok;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getBody() {
return body;
}
public void setBody(T body) {
this.body = body;
}
}
这里的body对应的就是返回的json的body
第二步:新建一个与返回的body类型对应的Bean类
import lombok.Data;
//使用@Data注解可以省去写get、set方法,要导入lambok依赖给下载lambok插件
//用的时候还是getXXX、setXXX
@Data
public class ResultBean implements Serializable {
/**
* name : xinjing
* age : 18
*/
private String name;
private String age;
}
第三步:新建一个ResponseParse类
@Parser(name = "Response") //这里name=XX,使用的时候就用asXX
public class ResponseParser<T> extends AbstractParser<T> {
protected ResponseParser() {
super();
}
public ResponseParser(Type type) {
super(type);
}
@SuppressWarnings("unchecked")
@Override
public T onParse(@NotNull okhttp3.Response response) throws IOException {
//下面的Response不是参数okhttp3.Response response,而是第一步自己建的Response类
final Type type = ParameterizedTypeImpl.get(Response.class, mType);
//下面的Response也是自己建的Response类
Response<T> data = convert(response,type);
T t = data.getBody(); //获取data字段
if (data.code != 200 || t == null) {
throw new ParseException(String.valueOf(data.code), data.getMsg(), response);
}
return t;
}
}
第四步:使用RxHttp解析json数据
RxHttp.postForm("要得到数据的网址")
.setDomainTobasicServicesUrlIfAbsent()
.add("username", username) //添加网址的参数
.add("password", password)
.asResponse(ResultBean.class)
.as(RxLife.asOnMain(view))
.subscribe(new Observer<ResultBean>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
//observer.onSubscribe(d);
}
@Override
public void onNext(@NonNull ResultBean resultBean) {
//这里写得到数据后要做的事,resultBean存储了json转换来的数据
//observer.onNext(resultBean);
}
@Override
public void onError(@NonNull Throwable e) {
//observer.onError(e);
}
@Override
public void onComplete() {
//observer.onComplete();
}
});
这样就完成了将联网返回的json对象转换为Bean对象的数据
3、解析Json数组
第一步:新建返回josn数据结构对应的Bean类
public class ResponseList<T> implements Serializable {
/**
* code : 200
* ok : true
* msg : 成功
* body : []
*/
private int code;
private boolean ok;
private String msg;
private List<T> body; //注意这里是List<T>
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public boolean isOk() {
return ok;
}
public void setOk(boolean ok) {
this.ok = ok;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public List<T> getBody() {
return body;
}
public void setBody(List<T> body) {
this.body = body;
}
}
第二步:新建一个与返回的body类型对应的Bean类
import lombok.Data;
//使用@Data注解可以省去写get、set方法,要导入lambok依赖给下载lambok插件
//用的时候还是getXXX、setXXX
@Data
public class ResultBean implements Serializable {
/**
* name : xinjing
* age : 18
*/
private String name;
private String age;
}
第三步:新建一个ResponseListParse类
@Parser(name = "ResponseList") //用的时候调用方法asResponseList(Bean类.getClass)
public class ResponseListParser<T> extends AbstractParser<List<T>> {
protected ResponseListParser() {
super();
}
public ResponseListParser(Type type) {
super(type);
}
@Override
public List<T> onParse(@NonNull Response response) throws IOException {
//下面的Response不是参数okhttp3.Response response,而是第一步自己建的Response类
Type type = ParameterizedTypeImpl.get(ResponseList.class, mType); //获取泛型类型
//下面的Response也是自己建的Response类
ResponseList<T> data = convert(response,type);
List<T> list=data.getBody();
if (data.getCode() != 200) {
throw new ParseException(String.valueOf(data.getCode()), data.getMsg(), response);
}
return list;
}
}
第四步:使用RxHttp解析json数据
RxHttp.get("网址")
.setDomainTobasicServicesUrlIfAbsent()
.add("key1", value1)
.add("key2", value2)
.asResponseList(ResultBean.class) //解析数据
//这里是Observer<List<ResultBean>>
.subscribe(new Observer<List<ResultBean>>() {
@Override
public void onSubscribe(@NonNull Disposable d) {
//observer.onSubscribe(d);
}
@Override
public void onNext(@NonNull List<ResultBean> resultBeans) {
//获取到的List<ResultBean>数据
//observer.onNext(resultBeans);
}
@Override
public void onError(@NonNull Throwable e) {
//observer.onError(e);
}
@Override
public void onComplete() {
//observer.onComplete();
}
});
}