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;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
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);
}
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
将解析器当成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;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
得到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}");
- 1
- 2
- 3
- 4
- 5
这样完整的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;
}
});
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
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;
}
});
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
这样就实现了通过一个异步任务,将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();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
这样的方法得到的是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() {
}
});
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34