java解析複雜json資料
阿新 • • 發佈:2018-12-17
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());
完成!!! 我希望逢著一個 撐著油紙傘的姑娘~