搜尋

首頁  >  問答  >  主體

android - 关于fastJson解析Json字符串的问题。JSONException: exepct '[', but {

伊谢尔伦伊谢尔伦2772 天前1392

全部回覆(4)我來回復

  • 巴扎黑

    巴扎黑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

    然後資料取得處(實際上你寫的只有這一段程式碼就解析好了。。
    rrreee

    即可。

    附錄

    🎜附錄1:http://www.bejson.com/json2javapojo/🎜附錄 2: GsonFormat介紹:http://www.jianshu.com/p/b83ea5e32ee1🎜 🎜 🎜好了,問題解決了,說個題外話,很多網路請求框架都自備標準json請求方式的。 🎜私以為,還是自己創建實體類,用著方便。 :-D🎜

    回覆
    0
  • 怪我咯

    怪我咯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 了。 。 。 。
    小白第一次回答問題。 。 。 。求見諒。 。 。

    回覆
    0
  • 怪我咯

    怪我咯2017-04-17 15:48:37

    datas = JSON.parseArray(jsonObject.toString(), Bean.class);

    jsonObject.toString()如果是原JSON字串,應該是可以解析出來的,你看看你這個值拿到的是什麼

    回覆
    0
  • 高洛峰

    高洛峰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 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三句

    回覆
    0
  • 取消回覆