JSON迭代解析

使用迭代器解析Json数据

第一次写博客,好紧张啊。
最近一个在培训机构培训的同学,向我请教Json数据解析的问题,和他沟通后发现他们解析数据的都是通过实体类来解析的。听他说,和他同班的同学甚至花了整整一天的时间来写实体类,感觉好麻烦。而且,如果返回的数据稍微有一点变化,可能整个数据解析就会报错。
废话不多说了,直接上案例。
首先是一段比较json数据
{
“reason”: “查询成功”,
“result”: {
“key”: “途观”,
“img”: “http://p6.qhimg.com/t01db9d7a7c953508c8.jpg“,
“carinfo”: [
{
“name”: “报价”,
“value”: “17.1-35.98万”
},
{
“name”: “指导价”,
“value”: “19.98-31.58万”
},
{
“name”: “排量”,
“value”: “1.4L 1.8L 2.0L”
},
{
“name”: “油耗”,
“value”: “6.90-9.20L”
},
{
“name”: “变速箱”,
“value”: “手动 自动”
},
{
“name”: “级别”,
“value”: “SUV”
}
],
“auto_series_info”: {
“cars”: [
{
“title”: “热门车款”,
“car”: [
{
“name”: “2015款 1.4T 手动 蓝驱版”,
“url”: “http://car.bitauto.com/tiguan/m111795/?WT.srch=2“,
“trans”: “手动”,
“guide_price”: “19.98万”,
“price”: “17.3万”,
“link_name”: “询价”,
“link_url”: “http://dealer.bitauto.com/zuidijia/nb2871/nc111795/?WT.srch=2
},
{
“name”: “2015款 1.8TSI 手动 前驱 风尚版”,
“url”: “http://car.bitauto.com/tiguan/m111794/?WT.srch=2“,
“trans”: “手动”,
“guide_price”: “19.98万”,
“price”: “17.1万”,
“link_name”: “询价”,
“link_url”: “http://dealer.bitauto.com/zuidijia/nb2871/nc111794/?WT.srch=2
},
{
“name”: “2015款 1.8TSI 手自一体 前驱 风尚版”,
“url”: “http://car.bitauto.com/tiguan/m111793/?WT.srch=2“,
“trans”: “自动”,
“guide_price”: “21.18万”,
“price”: “18.18万”,
“link_name”: “询价”,
“link_url”: “http://dealer.bitauto.com/zuidijia/nb2871/nc111793/?WT.srch=2
}
],
“total”: “21”,
“moreurl”: “http://car.bitauto.com/tiguan/?WT.srch=2
},
{
“title”: “1.4L”,
“car”: [
{
“name”: “2015款 1.4T 手动 蓝驱版”,
“url”: “http://car.bitauto.com/tiguan/m111795/?WT.srch=2“,
“trans”: “手动”,
“guide_price”: “19.98万”,
“price”: “17.3万”,
“link_name”: “询价”,
“link_url”: “http://dealer.bitauto.com/zuidijia/nb2871/nc111795/?WT.srch=2
},
{
“name”: “2013款 1.4T 手动 蓝驱版”,
“url”: “http://car.bitauto.com/tiguan/m104368/?WT.srch=2“,
“trans”: “手动”,
“guide_price”: “19.98万”,
“price”: “19.18万”,
“link_name”: “询价”,
“link_url”: “http://dealer.bitauto.com/zuidijia/nb2871/nc104368/?WT.srch=2
}
],
“total”: “2”,
“moreurl”: “http://car.bitauto.com/tiguan/?WT.srch=2
},
{
“title”: “1.8L”,
“car”: [
{
“name”: “2015款 1.8TSI 手动 前驱 风尚版”,
“url”: “http://car.bitauto.com/tiguan/m111794/?WT.srch=2“,
“trans”: “手动”,
“guide_price”: “19.98万”,
“price”: “17.1万”,
“link_name”: “询价”,
“link_url”: “http://dealer.bitauto.com/zuidijia/nb2871/nc111794/?WT.srch=2
},
{
“name”: “2015款 1.8TSI 手自一体 前驱 风尚版”,
“url”: “http://car.bitauto.com/tiguan/m111793/?WT.srch=2“,
“trans”: “自动”,
“guide_price”: “21.18万”,
“price”: “18.18万”,
“link_name”: “询价”,
“link_url”: “http://dealer.bitauto.com/zuidijia/nb2871/nc111793/?WT.srch=2
},
{
“name”: “2015款 1.8TSI 手动 前驱 限量版”,
“url”: “http://car.bitauto.com/tiguan/m113930/?WT.srch=2“,
“trans”: “手动”,
“guide_price”: “22.58万”,
“price”: “19.58万”,
“link_name”: “询价”,
“link_url”: “http://dealer.bitauto.com/zuidijia/nb2871/nc113930/?WT.srch=2
}
],
“total”: “15”,
“moreurl”: “http://car.bitauto.com/tiguan/?WT.srch=2
},
{
“title”: “2.0L”,
“car”: [
{
“name”: “2015款 2.0TSI 手自一体 四驱 豪华版”,
“url”: “http://car.bitauto.com/tiguan/m111777/?WT.srch=2“,
“trans”: “自动”,
“guide_price”: “29.18万”,
“price”: “25.98万”,
“link_name”: “询价”,
“link_url”: “http://dealer.bitauto.com/zuidijia/nb2871/nc111777/?WT.srch=2
},
{
“name”: “2015款 2.0TSI 旗舰版 手自一体 四驱”,
“url”: “http://car.bitauto.com/tiguan/m111776/?WT.srch=2“,
“trans”: “自动”,
“guide_price”: “31.58万”,
“price”: “28.38万”,
“link_name”: “询价”,
“link_url”: “http://dealer.bitauto.com/zuidijia/nb2871/nc111776/?WT.srch=2
},
{
“name”: “2013款 2.0TSI 手自一体 四驱 豪华版”,
“url”: “http://car.bitauto.com/tiguan/m104370/?WT.srch=2“,
“trans”: “自动”,
“guide_price”: “29.18万”,
“price”: “27.66万”,
“link_name”: “询价”,
“link_url”: “http://dealer.bitauto.com/zuidijia/nb2871/nc104370/?WT.srch=2
}
],
“total”: “4”,
“moreurl”: “http://car.bitauto.com/tiguan/?WT.srch=2
}
]
}
},
“error_code”: 0
}

这段数据可能比较长,但是格式化后看得比较直观一些,要是想看的更清晰点,推荐用相关的格式化工具,去适当的格式化一下。

首先看看他的结构:
Json Object 中嵌套Array,里边继续嵌套Object, Array。
这样的数据,去写实体类,相都不敢想。
接下来,看看我的解析方式:
public Hashtable< String, Object > decodeCar(String json){
Hashtable< String, Object > result = new Hashtable < >();

    try {
        JSONObject jsonObject = new JSONObject(json);
        if (Integer.parseInt(String.valueOf(jsonObject.get("error_code"))) == 0){
            JSONObject jsonObject1 = jsonObject.getJSONObject("result");
            Iterator<String> iterator = jsonObject1.keys();
            while (iterator.hasNext()){
                String key = iterator.next();
                if (key.equals("carinfo")){
                    JSONArray jsonArray = jsonObject1.getJSONArray(key);
                    List<Hashtable< String, Object>> carinfo = new ArrayList<>();
                    for (int i =0 ; i< jsonArray.length() ;i++){
                        Hashtable<String, Object> info = new Hashtable<>();
                        JSONObject jsonObject2 = jsonArray.getJSONObject(i);
                        Iterator< String> iterator1 = jsonObject2.keys();
                        while (iterator1.hasNext()){
                            String key1 = iterator1.next();
                            info.put(key1, jsonObject2.get(key1));
                        }
                        carinfo.add(info);
                    }
                    result.put(key, carinfo);
                }else if (key.equals("auto_series_info")){
                    JSONObject jsonObject2 = jsonObject1.getJSONObject(key);
                    Hashtable<String, Object> auto_series_info = new Hashtable<>();
                    Iterator<String> iterator1 = jsonObject2.keys();
                    while (iterator1.hasNext()){
                        String key1 = iterator1.next();
                        if (key1.equals("cars")){
                            JSONArray jsonArray = jsonObject2.getJSONArray("cars");
                            List<Hashtable<String, Object>> cars = new ArrayList<>();
                            for (int i = 0 ; i< jsonArray.length() ;i++){
                                JSONObject jsonObject3 = jsonArray.getJSONObject(i);
                                Iterator<String> iterator2 = jsonObject3.keys();
                                Hashtable<String, Object> map = new Hashtable<>();
                                while (iterator2.hasNext()){
                                    String key2 = iterator2.next();
                                    if (key2.equals("car")){
                                        JSONArray jsonArray1 = jsonObject3.getJSONArray(key2);
                                        List<Hashtable<String, Object>> carList = new ArrayList<>();
                                        for (int m = 0 ; m< jsonArray1.length() ;m++){
                                            JSONObject jsonObject4 = jsonArray1.getJSONObject(m);
                                            Iterator<String> iterator3 = jsonObject4.keys();
                                            Hashtable<String, Object> car = new Hashtable<>();
                                            while (iterator3.hasNext()){
                                                String key3 = iterator3.next();
                                                car.put(key3, jsonObject4.get(key3));
                                            }
                                        }
                                        map.put(key2, carList);
                                    }else {
                                        map.put(key2, jsonObject3.get(key2));
                                    }
                                }
                                cars.add(map);
                            }
                            auto_series_info.put(key1, cars);
                        }else {
                            auto_series_info.put(key1, jsonObject2.get(key1));
                        }
                    }
                    result.put(key, auto_series_info);
                }else {
                    result.put(key, jsonObject1.get(key));
                }
            }
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
    return result;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值