java解析复杂json数据 ╰半夏微凉° 2022-05-03 11:57 540阅读 0赞 ## java如何解析复杂的json数据 ## 关于json处理的包有好几个,比如jackson、Gson、Fastjson。Gson是谷歌做的,功能强大;Fastjson是阿里巴巴做的,性能更快。具体用哪个,开心就好。我这里两个都没用,用的是java的一个类库—json-lib。如果你用的是maven构建的项目,添加依赖请注意加上JDK版本15,[详情请戳这里][Link 1] 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()); 完成!!! 最后,如果对数据有需要的话,可以创建一个实体类,将相应的信息存储到数据库,以便调用。 [Link 1]: https://blog.csdn.net/qq_42815754/article/details/83446635
还没有评论,来说两句吧...