xUtils和FastJson获取和解析网络数据

FastJson解析Json数据

发送一个异步请求
发送一个同步请求
上传文件


发送一个异步任务就系Json数据

首先打开一个接口,里面是Json数据,通过xUtils框架来发送get请求,得到接口的Json字符串,将字符串用FastJson解析成一个实体类,保存在集合当中

在Gradle里面添加库工程

xUtils框架:compile ‘org.xutils:xutils:3.3.40’
FastJson:compile ‘com.alibaba:fastjson:1.1.56.android’
(我也不知道为什么显示出来的android是红色大写,应当是android)

实体类(VO类)的实现

首先我们要有一个可以打开的接口:
http://103.244.59.105:8014/paopaoserver/articles?params={“page”:1,”page_count”:10}
内容:
这里写图片描述
分析他的结构创建一个日常用品的Vo类,一般名字和id都是比较重要的

private String classify_name;
    private int classify_id;

    public int getClassify_id() {
        return classify_id;
    }

    public void setClassify_id(int classify_id) {
        this.classify_id = classify_id;
    }

    public String getClassify_name() {
        return classify_name;
    }

    public void setClassify_name(String classify_name) {
        this.classify_name = classify_name;
    }

Vo类的属性和Json数据里面的属性名字要一样,这样才能正确解析
有了一个Vo实体类之后我们就可以对Json进行映射

创建一个解析器

创建一个解析器,在整个工程里面可以都是用一个解析器进行数据解析

//创建一个解析器是实现ResponseParser 接口
public class JsonRespondParse implements ResponseParser {
    @Override
    public void checkResponse(UriRequest request) throws Throwable {

    }
//重写解析Json数据的方法
    @Override
    public Object parse(Type resultType, Class<?> resultClass, String result) throws Throwable {
    //判断整个数据是不是由一个List包裹起来的
        if (resultClass == List.class) {
        //将List解析成一个个小的对象(List的名字叫datas)
            result = JSON.parseObject(result).getString("datas");
            //解析成小的vo对象
            return JSON.parseArray(result, (Class<?>) ParameterizedTypeUtil.getParameterizedType(resultType, List.class, 0));
        } else {  //如果不是用List组成的则直接将Json进行解析成vo实体类
            return JSON.parseObject(result, resultClass);
        }

    }
}

将解析器当成vo类的注解 

在Vo类的最上方添加 的注解
@HttpResponse(parser = JsonRespondParse.class)
这样Json数据可以直接映射成Vo对象,并将这个对象放到List集合当中
Vo类全部代码:

@HttpResponse(parser = JsonRespondParse.class)
public class DayGoodsVo  {
    private String classify_name;
    private int classify_id;

    public int getClassify_id() {
        return classify_id;
    }

    public void setClassify_id(int classify_id) {
        this.classify_id = classify_id;
    }

    public String getClassify_name() {
        return classify_name;
    }

    public void setClassify_name(String classify_name) {
        this.classify_name = classify_name;
    }

    @Override
    public String toString() {
        return classify_name;
    }
}

得到Json数据

接下来就要得到Json数据了,只有拿到Json数据的字符串才能对它进行解析

这里要用到xUtils框架发送一个get请求来得到数据,xUtils框架的使用在这里就不进行介绍了
首先需要将接口拼接出来

//接口url
 RequestParams requestParams = new RequestParams
              ("http://103.244.59.105:8014/paopaoserver/articles");
              //拼接接口(参数名,参数)
        requestParams.addQueryStringParameter("params", "{\"page\":1,\"page_count\":10}");

这样完整的url就拼接好了
发送一个get请求,得到数据,并对数据进行解析

//用x.http().get发送一个get请求(url,得到返回数据并进行操作)
 x.http().get(requestParams, new Callback.CacheCallback<List<DayGoodsVo>>() {
 //得到返回数据会重写五个方法
            @Override
            public void onSuccess(List<DayGoodsVo> result) {
            //返回成功时可以直接得到List集合
            //如果是String.class得到的就是String字符串
                for (DayGoodsVo dayGoods : result) {
                    Log.e("tag", dayGoods.toString());
                    mList.add(dayGoods);
                }
                //将解析的数据放到适配器中,在ListView中进行显示
                mListView.setAdapter(new DayBaseAdapter(DayGoodsActivity.this, mList));
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {

            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }

            @Override
            public boolean onCache(List<DayGoodsVo> result) {
                return false;
            }
        });


    }

x.http()里面包含着子线程,所以不用再单独开启一个子线程去实现网路请求,而且数据显示在ListView中也直接在onSuccess()中实现
下面是完整的代码

 private void getHttpData() {
        RequestParams requestParams = new RequestParams
                ("http://103.244.59.105:8014/paopaoserver/articles");
        requestParams.addQueryStringParameter("params", "{\"page\":1,\"page_count\":10}");
        x.http().get(requestParams, new Callback.CacheCallback<List<DayGoodsVo>>() {
            @Override
            public void onSuccess(List<DayGoodsVo> result) {
                for (DayGoodsVo dayGoods : result) {
                    Log.e("tag", dayGoods.toString());
                    mList.add(dayGoods);
                }
                mListView.setAdapter(new DayBaseAdapter(DayGoodsActivity.this, mList));
            }

            @Override
            public void onError(Throwable ex, boolean isOnCallback) {

            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }

            @Override
            public boolean onCache(List<DayGoodsVo> result) {
                return false;
            }
        });


    }

这样就实现了通过一个异步任务,将Json数据直接解析成一个Vo实体类


发送一个同步任务

//同步线程中去访问网路,必须要在子线程中
    public void httpGetSync() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                RequestParams requestParams = new RequestParams(urlJson);
                //添加一个请求,获取信息
                //键值对的形式来把请求参数进行一个封装
                requestParams.addQueryStringParameter("sex", "girl");
                try {
                    String result = x.http().getSync(requestParams, String.class);

                    Log.d("TAG", "result:" + result);

                } catch (Throwable throwable) {
                    throwable.printStackTrace();
                }
            }
        }).start();

    }

这样的方法得到的是String字符串,也可以用上面直接解析到list中

上传文件

//上传文件
    private void upload() {
    //上传文件的网址
        RequestParams requestParams = new RequestParams(fileUrl);
        //模仿一个表单,模拟上传一个文件
        //上传的是一个表单,而且可以上传文件
        requestParams.setMultipart(true);
        //上传文件(给文件定义一个名字file,head,上传的文件或者头像)
        requestParams.addBodyParameter("file", new File(filePath));
        //发送上传的请求,Get请求不能上传表单请求,要用Post请求
        x.http().post(requestParams, new Callback.CommonCallback<String>() {
            @Override
            public void onSuccess(String result) {
                Log.d("TAG", "uoload success");

            }
            @Override
            public void onError(Throwable ex, boolean isOnCallback) {

            }

            @Override
            public void onCancelled(CancelledException cex) {

            }

            @Override
            public void onFinished() {

            }
        });


    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值