java遍歷復雜json字符串獲取想要的數據
https://blog.csdn.net/qq_34309663/article/details/80508125
java如何解析復雜的json數據
關於json處理的包有好幾個,比如jackson、Gson、Fastjson。Gson是谷歌做的,功能強大;Fastjson是阿裏巴巴做的,性能更快。具體用哪個,開心就好。我這裏兩個都沒用,用的是java的一個類庫—json-lib。如果你用的是maven構建的項目,添加依賴請註意加上JDK版本15,詳情請戳這裏
ok,多的不說了,讓我們直接來解析一個復雜的json數據吧,如下:
String weather = {
"HeWeather6": [
{
"basic": {
"cid": "CN101010100",
"location": "北京",
"parent_city": "北京",
"admin_area": "北京",
"cnty": "中國",
"lat": "39.90498734",
"lon": "116.40528870",
"tz": "8.0"
},
"daily_forecast": [
{
"cond_code_d": "103",
"cond_code_n": "101",
"cond_txt_d": "晴間多雲",
"cond_txt_n": "多雲",
"date": "2017-10-26",
"hum": "57",
"pcpn": "0.0",
"pop": "0",
"pres": "1020",
"tmp_max": "16",
"tmp_min": "8",
"uv_index": "3",
"vis": "16",
"wind_deg": "0",
"wind_dir": "無持續風向",
"wind_sc": "微風",
"wind_spd": "5"
},
{
"cond_code_d": "101",
"cond_code_n": "501",
"cond_txt_d": "多雲",
"cond_txt_n": "霧",
"date": "2017-10-27",
"hum": "56",
"pcpn": "0.0",
"pop": "0",
"pres": "1018",
"tmp_max": "18",
"tmp_min": "9",
"uv_index": "3",
"vis": "20",
"wind_deg": "187",
"wind_dir": "南風",
"wind_sc": "微風",
"wind_spd": "6"
},
{
"cond_code_d": "101",
"cond_code_n": "101",
"cond_txt_d": "多雲",
"cond_txt_n": "多雲",
"date": "2017-10-28",
"hum": "26",
"pcpn": "0.0",
"pop": "0",
"pres": "1029",
"tmp_max": "17",
"tmp_min": "5",
"uv_index": "2",
"vis": "20",
"wind_deg": "2",
"wind_dir": "北風",
"wind_sc": "3-4",
"wind_spd": "19"
}
],
"status": "ok",
"update": {
"loc": "2017-10-26 23:09",
"utc": "2017-10-26 15:09"
}
}
]
}
這裏請先將json數據轉換成json字符串,直接.toString()即可
解析之前,先簡單分析一下該json的結構:
首先,最外層是一個{},裏面只有一個key是"HeWeather6",對應的value是[],顯然是一個數組;
然後,第二層也就是第一層的value。該層由一個{}組成,{}裏面有4對key-value,分別是:
"basic": {...}
"daily_forecast" : [...]
"status":"ok"
"upate": {...}
第3對數據就不用多說了,第1和第4對數據也很清晰了,key對應的value都是簡單的json數據;
所以,唯一需要再往裏分析的就是第2對數據了,其對應的value是[],顯然又是一個數組。數組裏面也很明了了,也都是簡單的json數據。
ps:我這裏簡單的json數據,指的是key-value都是簡單的字符串,沒有其他復雜的數據結構。
到此,分析完畢!哇哦,是不是發現解析復雜的json數據就像剝洋蔥一樣,一層一層的往裏剝,其實也很簡單!只要學會了分析,有點耐心,就算再復雜的json數據也能把它給解析出來~
最後,上代碼,如下(解釋我全都會寫在註釋裏面,就不再解釋什麽啦):
JSONObject jsonObject = JSONObject.fromObject(weather);
//獲取第二層的數組,將其轉換成JSONArray,對應的key為HeWeather6
JSONArray jsonArray = jsonObject.getJSONArray("HeWeather6");
//獲取JSONArray 裏面的數據,因為jsonArray裏面只有一個數據(一個{}),所以獲取value值的角標為0
JSONObject jsonObject2 = jsonArray.getJSONObject(0);
//獲取4對數據的value,這裏先獲取最簡單的第3對數據的值 打印"three"可得 -> ok
String three= jsonObject2.get("status").toString();
//然後獲取第1對數據的值,先獲取對應的json 然後獲取json裏面的value值
JSONObject one = jsonObject2.getJSONObject("basic");
String oneCid = two.get("cid").toString();
//打印oneCid可得 -> CN101010100 其他以此類推,第4對數據同理,就不再贅述了
//最後獲取第2對數據的value值 思路:先獲取數組,然後遍歷,分別拿到裏面的值
JSONArray twos = jsonObject2.getJSONArray("daily_forecast");
JSONObject two = null;
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
for (int i = 0; i < twos.size(); i++) {
two = twos.getJSONObject(i);
Map<String, String> map = new HashMap<String, String>();
map.put("天氣情況", twos.get("cond_txt_d").toString());
map.put("最高溫度", twos.get("tmp_max").toString());
map.put("風力情況", twos.get("wind_sc").toString());
list.add(map);
}
System.out.println(list.toString());
完成!!!
java遍歷復雜json字符串獲取想要的數據