安卓json解析——12306查询票价的字符串解析

来源:互联网 发布:认知心理学 知乎 编辑:程序博客网 时间:2024/05/01 15:48

突然看到群里有2个同学都在问关于json数据解析的问题,当然很多人用工具解析,都忘记是怎么解析,那我就先贴一下原始数据吧:

{"reason":"查询成功","result":{"list":[{"train_no":"K599","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河","end_station_type":"过","start_time":"05:14","end_time":"15:50","run_time":"10小时36分","price_list":[{"price_type":"硬座","price":"112.0"},{"price_type":"硬卧","price":"219.0"},{"price_type":"软卧","price":"339.0"},{"price_type":"无座","price":"112.0"}]},{"train_no":"G529","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河西","end_station_type":"过","start_time":"07:26","end_time":"11:27","run_time":"4小时1分","price_list":[{"price_type":"二等座","price":"373.0"},{"price_type":"一等座","price":"597.0"},{"price_type":"商务座","price":"1179.0"}]},{"train_no":"K21","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河","end_station_type":"过","start_time":"08:06","end_time":"19:48","run_time":"11小时42分","price_list":[{"price_type":"硬座","price":"112.0"},{"price_type":"硬卧","price":"219.0"},{"price_type":"软卧","price":"339.0"},{"price_type":"无座","price":"112.0"}]},{"train_no":"K471","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河","end_station_type":"过","start_time":"08:45","end_time":"19:13","run_time":"10小时28分","price_list":[{"price_type":"硬座","price":"112.0"},{"price_type":"硬卧","price":"219.0"},{"price_type":"软卧","price":"339.0"},{"price_type":"无座","price":"112.0"}]},{"train_no":"K967","train_type":"","start_station":"北京","start_station_type":"过","end_station":"漯河","end_station_type":"过","start_time":"08:45","end_time":"20:12","run_time":"11小时27分","price_list":[{"price_type":"硬座","price":"112.0"},{"price_type":"硬卧","price":"219.0"},{"price_type":"软卧","price":"339.0"},{"price_type":"无座","price":"112.0"}]},{"train_no":"G421","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河西","end_station_type":"过","start_time":"09:07","end_time":"12:58","run_time":"3小时51分","price_list":[{"price_type":"二等座","price":"373.0"},{"price_type":"一等座","price":"597.0"},{"price_type":"商务座","price":"1179.0"}]},{"train_no":"G511","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河西","end_station_type":"过","start_time":"09:27","end_time":"13:29","run_time":"4小时2分","price_list":[{"price_type":"二等座","price":"373.0"},{"price_type":"一等座","price":"597.0"},{"price_type":"特等座","price":"711.0"}]},{"train_no":"K279","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河","end_station_type":"过","start_time":"09:52","end_time":"21:08","run_time":"11小时16分","price_list":[{"price_type":"硬座","price":"112.0"},{"price_type":"硬卧","price":"219.0"},{"price_type":"软卧","price":"339.0"},{"price_type":"无座","price":"112.0"}]},{"train_no":"G557","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河西","end_station_type":"过","start_time":"11:07","end_time":"15:03","run_time":"3小时56分","price_list":[{"price_type":"二等座","price":"373.0"},{"price_type":"一等座","price":"597.0"},{"price_type":"商务座","price":"1179.0"}]},{"train_no":"G67","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河西","end_station_type":"过","start_time":"12:13","end_time":"16:31","run_time":"4小时18分","price_list":[{"price_type":"二等座","price":"373.0"},{"price_type":"一等座","price":"597.0"},{"price_type":"商务座","price":"1179.0"}]},{"train_no":"T145","train_type":"","start_station":"北京","start_station_type":"过","end_station":"漯河","end_station_type":"过","start_time":"12:38","end_time":"21:36","run_time":"8小时58分","price_list":[{"price_type":"硬座","price":"112.0"},{"price_type":"硬卧","price":"219.0"},{"price_type":"软卧","price":"339.0"},{"price_type":"无座","price":"112.0"}]},{"train_no":"T167","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河","end_station_type":"过","start_time":"14:16","end_time":"22:54","run_time":"8小时38分","price_list":[{"price_type":"硬座","price":"112.0"},{"price_type":"硬卧","price":"219.0"},{"price_type":"软卧","price":"339.0"},{"price_type":"无座","price":"112.0"}]},{"train_no":"G503","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河西","end_station_type":"过","start_time":"14:38","end_time":"18:18","run_time":"3小时40分","price_list":[{"price_type":"二等座","price":"373.0"},{"price_type":"一等座","price":"597.0"},{"price_type":"商务座","price":"1179.0"}]},{"train_no":"G587","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河西","end_station_type":"过","start_time":"14:55","end_time":"19:09","run_time":"4小时14分","price_list":[{"price_type":"二等座","price":"373.0"},{"price_type":"一等座","price":"597.0"},{"price_type":"商务座","price":"1179.0"}]},{"train_no":"T49","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河","end_station_type":"过","start_time":"15:11","end_time":"00:47","run_time":"9小时36分","price_list":[{"price_type":"硬座","price":"112.0"},{"price_type":"硬卧","price":"219.0"},{"price_type":"软卧","price":"339.0"},{"price_type":"无座","price":"112.0"}]},{"train_no":"G521","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河西","end_station_type":"过","start_time":"15:23","end_time":"19:36","run_time":"4小时13分","price_list":[{"price_type":"二等座","price":"373.0"},{"price_type":"一等座","price":"597.0"},{"price_type":"商务座","price":"1179.0"}]},{"train_no":"G585","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河西","end_station_type":"过","start_time":"16:23","end_time":"20:41","run_time":"4小时18分","price_list":[{"price_type":"二等座","price":"373.0"},{"price_type":"一等座","price":"597.0"},{"price_type":"商务座","price":"1179.0"}]},{"train_no":"G523","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河西","end_station_type":"过","start_time":"16:30","end_time":"20:21","run_time":"3小时51分","price_list":[{"price_type":"二等座","price":"373.0"},{"price_type":"一等座","price":"597.0"},{"price_type":"商务座","price":"1179.0"}]},{"train_no":"G525","train_type":"","start_station":"北京西","start_station_type":"始","end_station":"漯河西","end_station_type":"过","start_time":"17:14","end_time":"21:16","run_time":"4小时2分","price_list":[{"price_type":"二等座","price":"373.0"},{"price_type":"一等座","price":"597.0"},{"price_type":"商务座","price":"1179.0"}]},{"train_no":"K261","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河","end_station_type":"过","start_time":"17:18","end_time":"04:13","run_time":"10小时55分","price_list":[{"price_type":"硬座","price":"112.0"},{"price_type":"硬卧","price":"219.0"},{"price_type":"软卧","price":"339.0"},{"price_type":"无座","price":"112.0"}]},{"train_no":"K401","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河","end_station_type":"过","start_time":"19:36","end_time":"06:35","run_time":"10小时59分","price_list":[{"price_type":"硬座","price":"112.0"},{"price_type":"硬卧","price":"219.0"},{"price_type":"软卧","price":"339.0"},{"price_type":"无座","price":"112.0"}]},{"train_no":"T289","train_type":"","start_station":"北京西","start_station_type":"过","end_station":"漯河","end_station_type":"过","start_time":"22:08","end_time":"06:20","run_time":"8小时12分","price_list":[{"price_type":"硬座","price":"112.0"},{"price_type":"硬卧","price":"219.0"},{"price_type":"软卧","price":"339.0"},{"price_type":"高级软卧","price":"715.0"},{"price_type":"无座","price":"112.0"}]}]},"error_code":0}


一、先将数据解析格式化


二、 创建数据对象

/**     * 数组对象中每一元素对应的数据     * end_station : 漯河     * end_station_type : 过     * end_time : 06:20     * run_time : 8小时12分     * start_station : 北京西     * start_station_type : 过     * start_time : 22:08     * train_no : T289     * train_type :     */    private class Province{        private String end_station;        private String end_station_type;        private String end_time;        private String run_time;        private String start_station;        private String start_station_type;        private String start_time;        private String train_no;        private String train_type;        private List<PriceListBean> price_list;        //get(),set()就不贴出来了    }

 /**     * "price": "112.0",     * "price_type": "无座"     */    public class PriceListBean {        private String price;        private String price_type;    }

三、开始解析

 /**     * 12306查询票价的字符串     *     * @param shuju 原始字符串数据     */    public List<Province>  parseResult(@NonNull JSONObject shuju) {        List<Province> provinces;        JSONObject resultObject = shuju.optJSONObject("result");//获取到result这层数据        JSONArray listJsonArray = resultObject.optJSONArray("list");// 获取到list这层数据        //校验数据的合法性:为了防止坑爹的后台哥们        if (listJsonArray == null || listJsonArray.length() == 0) {            return null;        }        provinces = new ArrayList<>();        for (int x = 0; x < listJsonArray.length(); x++) {            JSONObject object = listJsonArray.optJSONObject(x);            //校验单个数据,只是退出当前循环            if (object == null) {                continue;            }            Province province = new Province();            province.setEnd_station(object.optString("end_station"));            province.setEnd_station_type(object.optString("end_station_type"));            province.setEnd_time(object.optString("end_time"));            province.setRun_time(object.optString("run_time"));            province.setStart_station(object.optString("start_station"));            province.setStart_station_type(object.optString("start_station_type"));            province.setStart_time(object.optString("start_time"));            province.setTrain_no(object.optString("train_no"));            province.setTrain_type(object.optString("train_type"));            //解析票价数组对象            JSONArray price_list = object.optJSONArray("price_list");            List<PriceListBean> price = getPrice(price_list);            province.setPrice_list(price);            provinces.add(province);        }        return provinces;    }    /**     * 解析票价     *     * @param jsonArray JSONArray数据对象     * @return List<PriceListBean> 价格集合     */    private List<PriceListBean> getPrice(@NonNull JSONArray jsonArray) {        if (jsonArray.length() == 0) {            return null;        }        List<PriceListBean> list = new ArrayList<>();        for (int x = 0; x < jsonArray.length(); x++) {            JSONObject object = jsonArray.optJSONObject(x);            //校验单个数据,只是退出当前循环            if (object == null) {                continue;            }            PriceListBean bean = new PriceListBean();            bean.setPrice(object.optString("price"));            bean.setPrice_type(object.optString("price_type"));            list.add(bean);        }        return list;    }

注意:解析过程中用的是optString():这个方法的好处是就算数据为空,会自动添加默认数据,更不需要抛异常


0 0
原创粉丝点击