繁体   English   中英

使用GSON的Android JSON解析数组

[英]Android JSON parsing arrays with GSON

在一天的大部分时间里,我一直在与GSON作战。 好吧,我想我对GSON的了解不如我对Android列表的一般不了解。 基本上发生了什么事,我正在接收2个JSON数组,然后将每个数组格式化并显示在列表中:

Adventures:
+-------------+
| Adventure 1 |
+-------------+
| Adventure 2 |
+-------------+
Events:
+-------------+
|   Event 1   |
+-------------+
|   Event 2   |
+-------------+

我能够很好地读出单个字符串,但是我并没有将其移到数组上。 我收到的JSON格式是:

{
"events": [
    {
        "eid": "11111111",
        "bid": "aaaaaaaa",
        "bname": "Example Business 1",
        "start": "3/26/14 @ 6pm",
        "end": "3/27/14 @ 2am",
        "points": "50",
        "title": "Example Event 1",
        "description": "Example Event Description",
        "cat": "Nightlife",
        "type": "Bar",
        "subtype": "Karaoke",
        "valid": true
    },
    {
        "eid": "22222222",
        "bid": "bbbbbbbb",
        "bname": "Example Business 2",
        "start": "3/26/14 @ 6pm",
        "end": "3/27/14 @ 2am",
        "points": "50",
        "title": "Example Event 2",
        "description": "Example Event Description",
        "cat": "Nightlife",
        "type": "Comedy",
        "subtype": "General",
        "valid": true
    },
    {
        "eid": "33333333",
        "bid": "cccccccc",
        "bname": "Example Business 3",
        "start": "3/26/14 @ 6pm",
        "end": "3/27/14 @ 2am",
        "points": "150",
        "title": "Example Event 3",
        "description": "Example Event Description",
        "cat": "Dining",
        "type": "Restraunt",
        "subtype": "Chinese",
        "valid": true
    }
],
"adventures": [
    {
        "aid": "11111111",
        "bid": "aaaaaaaa",
        "start": "3/26/14 6pm",
        "end": "3/27/14 2am",
        "points": "150",
        "title": "Example Adventure 1",
        "description": "Example Adventure Description",
        "cat": "Nightlife",
        "type": "Bar",
        "subtype": "Karaoke",
        "steps_comp": "2",
        "total_steps": "5",
        "valid": true
    },
    {
        "aid": "22222222",
        "bid": "bbbbbbbb",
        "start": "3/26/14 6pm",
        "end": "3/27/14 2am",
        "points": "250",
        "title": "Example Adventure 2",
        "description": "Example Adventure Description",
        "cat": "Nightlife",
        "type": "Bar",
        "subtype": "Neighborhood",
        "steps_comp": "0",
        "total_steps": "5",
        "valid": true
    }
]

}

我正在使用以下内容(包括Volley代码)解析JSON:

RequestQueue queue = Volley.newRequestQueue(this);
    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.GET, full_url, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            String example = response.toString();
            Log.e("JSON Response", example);

            try {
                JsonParser jsonParser = new JsonParser();
                JsonObject jo = (JsonObject)jsonParser.parse(example);
                JsonArray jsonArr = jo.getAsJsonArray("events");
                //jsonArr.
                Gson googleJson = new Gson();
                ArrayList jsonObjList = googleJson.fromJson(jsonArr, ArrayList.class);

                System.out.println("List size is : "+jsonObjList.size());
                System.out.println("List Elements are  : "+jsonObjList.toString());

                for (int i = 0; i < jsonObjList.size(); i++){
                       String item = jsonObjList.get(i).toString();
                       System.out.println("Item " + i + " : " + item);
                }

                Toast.makeText(getApplicationContext(), "0: "+jsonObjList.get(0),
                        Toast.LENGTH_LONG).show();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            Toast.makeText(getApplicationContext(), "blah",
               Toast.LENGTH_LONG).show();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // TODO Auto-generated method stub
        }
    }
);
queue.add(jsObjRequest);

我的每一行都很好,但它只是一个字符串,因此我无法了解每一行的各个元素。 我在想我可能需要在for循环内执行另一个GSON调用,以同时打破该循环,然后将其放置在数组中? 这看起来很混乱。 我做了一些谷歌搜索(到目前为止,我还没做完),但是我似乎无法将各个部分放在一起以使这一工作可行。 任何帮助,将不胜感激。

首先为每个JsonAarry创建类以容纳值

public class Events {
    private String eid;
    private String bid;
    private String bname;
    private String start;
    private String end;
    private String points;
    private String title;
    private String description;
    private String cat;
    private String type;
    private String subtype;
    private boolean valid;
    @Override
    public String toString() {
        return "Events [eid=" + eid + ", bid=" + bid + ", bname=" + bname
                + ", start=" + start + ", end=" + end + ", points=" + points
                + ", title=" + title + ", description=" + description
                + ", cat=" + cat + ", type=" + type + ", subtype=" + subtype
                + ", valid=" + valid + "]";
    }

}

public class Adventures {
    private String aid;
    private String bid;
    private String start;
    private String end;
    private String points;
    private String title;
    private String description;
    private String cat;
    private String type;
    private String subtype;
    private String steps_comp;
    @Override
    public String toString() {
        return "Adventures [aid=" + aid + ", bid=" + bid + ", start=" + start
                + ", end=" + end + ", points=" + points + ", title=" + title
                + ", description=" + description + ", cat=" + cat + ", type="
                + type + ", subtype=" + subtype + ", steps_comp=" + steps_comp
                + ", total_steps=" + total_steps + ", valid=" + valid + "]";
    }
    private String total_steps;
    private boolean valid;

}

现在创建一个包含整个响应的类

public class ResponseHolder {
    private ArrayList<Events> events;
    private ArrayList<Adventures> adventures;
    @Override
    public String toString() {
        return "ResponseHolder [events=" + events + ", adventures="
                + adventures + "]";
    }
    public ArrayList<Events> getEvents() {
        return events;
    }
    public ArrayList<Adventures> getAdventures() {
        return adventures;
    }
}

最后

Gson googleJson = new Gson();
ResponseHolder rh= googleJson.fromJson(jsonArr, ResponseHolder.class);

并获得像

        for(Events e: rh.getEvents()){
            System.out.println(e.toString());
        }

        for(Adventures e: rh.getAdventures()){
            System.out.println(e.toString());
        }

为您的每个json对象创建Java对象。 例如:

public class Event {

  private String bid;
  private int eid;

}

public class Adventure {
    private String bid;
    private int eid;
 // rest of the fields
}

然后,创建一个包含以下对象的类:

public class JsonResponse {
  private ArrayList<Event> events;
  private ArrayList<Adventure> adventures;
}

在您的代码中,您应该能够按如下方式反序列化:

Gson googleJson = new Gson();
JsonResponse jsonObjList = googleJson.fromJson(jsonArr, JsonResponse .class);

我不明白你的意思,但是我认为你在如何从jsonarray获取每个值的过程中苦苦挣扎,如果这样的话,你在for循环中的这段代码

 jsonobject = jsonArr.getJSONObject(i);
  if (jsonobject != null) 
   {
   String ID= jsonobject.getString("eid");
   String BID= jsonobject.getString("bid");

 // Like this implement for other jsonobjects

    }
        I have same problem. and i have json like this.

            {
                "latest_posting": [
                    {
                        "posting_id": "7",
                        "posting_title": "Ring",
                        "photo_img": "images/posting/IMG_12121212.png.png",
                        "normal_price": null
                    },
                    {
                        "posting_id": "8",
                        "posting_title": "dsadsd",
                        "photo_img": "images/posting/IMG_1212121216.jpg",
                        "normal_price": null
                    },
                    {
                        "posting_id": "9",
                        "posting_title": "dasd",
                        "photo_img": "images/posting/IMG_121212122.png",
                        "normal_price": null
                    }
                ],
                "promotion_litsing": [
                    {
                        "posting_id": "10",
                        "posting_title": "dasd",
                        "photo_img": "images/posting/IMG_121212123.png",
                        "normal_price": null
                    }
                ]
            }

        you said that 
        JsonResponse jsonObjList = googleJson.fromJson(jsonArr, JsonResponse .class);


        But we have two array in data set class right which "jsonArr" we pass for parsing. 

        to get each of separate response of array in log.

        My data set class




        public class BannerAdvertismentVO implements Serializable {

            private ArrayList<NormalPostingVO> promotion_listing;


            private ArrayList<NormalPostingVO> latest_posting ;


            public ArrayList<NormalPostingVO> getPromotion_listing() {
                return promotion_listing;
            }


            public void setPromotion_listing(ArrayList<NormalPostingVO> promotion_listing) {
                this.promotion_listing = promotion_listing;
            }


            public ArrayList<NormalPostingVO> getLatest_posting() {
                return latest_posting;
            }


            public void setLatest_posting(ArrayList<NormalPostingVO> latest_posting) {
                this.latest_posting = latest_posting;
            }



        }





 private String posting_id;
    private String posting_title;
    private String photo_img;
    private String normal_price;



    public String getPosting_id() {
        return posting_id;
    }
    public void setPosting_id(String posting_id) {
        this.posting_id = posting_id;
    }
    public String getPosting_title() {
        return posting_title;
    }
    public void setPosting_title(String posting_title) {
        this.posting_title = posting_title;
    }
    public String getNormal_price() {
        return normal_price;
    }
    public void setNormal_price(String normal_price) {
        this.normal_price = normal_price;
    }
    public String getPhoto_img() {
        return photo_img;
    }
    public void setPhoto_img(String photo_img) {
        this.photo_img = photo_img;
    }
    my parser class

    public static BannerAdvertismentVO parseBannerAdvertismentData(String response){

            BannerAdvertismentVO banner  =null;
             Gson Json;

            try {
                JSONObject jsonObject = new JSONObject(response);

                Json = new GsonBuilder().create();

                banner = Json.fromJson(jsonObject.toString(), BannerAdvertismentVO .class);

                Log.e("", "LOG1==" + banner.getLatest_posting() +"/n"+ banner.getPromotion_listing());



            } catch (Exception e) {
                e.printStackTrace();
            }




            return banner;
        }

this show me null->banner.getPromotion_listing();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM