使用迭代器解析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;
}