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

来源:互联网 发布:孙悟空直销软件 编辑:程序博客网 时间:2024/06/10 05:20

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
原创粉丝点击