巴扎黑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
(坐上來,自己動) ,詳見附錄2GsonFormat
(坐上来,自己动) ,详见附录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
實際上你寫的只有這一段程式碼就解析好了。。
)即可。
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
用 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
=================================
貼出一些筆記,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三句