RxHttp1.x Json数据解析(包括Json对象和Json数组)

7 篇文章 0 订阅
2 篇文章 0 订阅

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();
                    }
                });
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值