Maison > Questions et réponses > le corps du texte
巴扎黑2017-04-17 15:48:37
根据你这个API地址 http://www.imooc.com/api/teacher?type=4&num=30
返回的json数据有两层,而你只解析了一层,当然会数据错误。
应该是建立两层
DataBean
public class DataBean {
private int id;
private String name;
private String picSmall;
private String picBig;
private String description;
private int learner;
//此处省略 getter & setter
}
RootGroup
public class RootGroup {
private int status;
private List<DataBean> data;
private String msg;
//此处省略 getter & setter
}
以上由下方工具生成(动手的地方比较多)。,详见附录1
Ps. Android Studio 上还有更方便的插件 GsonFormat
(坐上来,自己动) ,详见附录2
然后数据获取处(实际上你写的只有这一段代码就解析好了。。
)
RootGroup root = JSON.parseObject(jsonStr, RootGroup.class);
for (int i = 0; i < root.getData().size(); i++) {
Sys.out(root.getData().get(i).getName());
}
即可。
附录1: http://www.bejson.com/json2javapojo/
附录2: GsonFormat
介绍:http://www.jianshu.com/p/b83ea5e32ee1
好了,问题解决了,说个题外话,很多网络请求框架都自带标准json请求方式的。
私以为,还是自己创建实体类,用着方便。 :-D
怪我咯2017-04-17 15:48:37
fastJson我没用过,不过用 Gson 去解析很快。。。
根据你的JSON数据格式定义如下的Bean:
注意:内部嵌套的类必须是static。
public class Bean{
public List<Info> info;
public static class Info {
private String id;
private String name;
private String picSmall;
private String picBig;
private String description;
private String learner;
//Get,set方法省略。。。
}
public List<Info> getInfo() {
return this.info;
}
}
使用 Gson 去解析:
// 1)
Gson gson = new Gson();
// 2)
java.lang.reflect.Type type = new TypeToken<Bean2>() {}.getType();
// 3)
Bean temp = gson.fromJson(json2,type);
这样,得出来的 Bean 的对象temp,就是一个 List<Info> ,
用 temp.getInfo().get(i) 就能得到内部类 Info 了。。。。
小白第一次回答问题。。。。求见谅。。。
怪我咯2017-04-17 15:48:37
datas = JSON.parseArray(jsonObject.toString(), Bean.class);
jsonObject.toString()如果是原JSON字符串,应该是可以解析出来的,你看看你这个值拿到的是什么
高洛峰2017-04-17 15:48:37
首先,直接用 JsonArray data=Json.getJsonArray("data"),无法完成........
行得通的做法是(不是很理解Json数据,还得研究研究):把参数返回的jsonObject转换为FastJson的JsonObject,获得的竟然是有三个项目的集合,这怎么理解?然后再从从这个集合中获取“data”数组,并且用FastJson的JsonArray转为集合......
public void onResponse(JSONObject jsonObject) {
com.alibaba.fastjson.JSONObject list = (com.alibaba.fastjson.JSONObject) JSON.parse(jsonObject.toString());
JSONArray data = list.getJSONArray("data");
Log.i("ddd", ""+data.size());
}
还得研究研究...折腾出真知
=======================
后来发现这个Json数据原来是这样的:本身是一个三个数据的集合,然后如果直接获取data集合就错了...
====================================
获取了data的数据后,就可以直接关联JavaBean了,这就比传统的省了一大段繁琐代码.......这里是自动关联了。
com.alibaba.fastjson.JSONObject list = (com.alibaba.fastjson.JSONObject) JSON.parse(jsonObject.toString());
JSONArray tempArray = list.getJSONArray("data");
datas = JSON.parseArray(tempArray.toJSONString(), Bean.class);
这是要注意要命的一点是,也在原文中错误的一点,
List<Bean> datas=null; 不需要先new一个ArrayList出来,然后再关联数据,是不行的;就让datas=null, 等到自动关联数据的时候就会自动对应存好数据了.......
=================================
贴出一些笔记,fastJson常用的方法
1 public static final Object parse(String text); // 把JSON文本parse为JSONObject或者JSONArray
2 public static final JSONObject parseObject(String text); // 把JSON文本parse成JSONObject
3 public static final T parseObject(String text, Class clazz); // 把JSON文本parse为JavaBean
4 public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray
5 public static final List parseArray(String text, Class clazz); //把JSON文本parse成JavaBean集合
6 public static final String toJSONString(Object object); // 将JavaBean序列化为JSON文本
7 public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本
8 public static final Object toJSON(Object javaObject); 将JavaBean转换为JSONObject或者JSONArray。
如果有一段Json字符串数据,要把它parse先,然后再进行fastJson的操作......比如此例子中,volley返回的jsonOject直接用就不行,是不是它仅仅只是字符串?但是经过fastJson解析转化后就能用了......
=============================================
经过最佳答案的那位网友介绍JsonFormat很好用.....有了它这一切问题迎刃而解:
fastJson的解决如下:
提前用JsonFormat生成了Bean这样一个javaBean类,然后就如下两句代码搞定:
private void getJsonData() {
final StringRequest request = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
// Bean bean = (Bean) JSON.parseArray(s, Bean.class); 这里用parseArray会出错
Bean bean = (Bean) JSON.parseObject(s, Bean.class);
datas = bean.getData();
Log.d("ddd", datas.size() + "");
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.d("ddd", volleyError.getMessage());
}
});
queue.add(request);
}
===============================================
再补充楼上提示的用Gson解决,貌似Gson需要三句代码:
JsonFormat的操作一样.....
private void getJsonData() {
final StringRequest request = new StringRequest(url, new Response.Listener<String>() {
@Override
public void onResponse(String s) {
//// TODO:
Gson gson = new Gson();
Type type = new TypeToken<Bean>() {
}.getType();
Bean bean = gson.fromJson(s, Bean.class);
datas = bean.getData();
// Log.d("ddd", datas.get(1).getDescription());
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError volleyError) {
Log.d("ddd", volleyError.getMessage());
}
});
queue.add(request);
}
综上,所以fastJson是可以两句代码取到数据,Gson三句