zoukankan      html  css  js  c++  java
  • 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());

    完成!!!

  • 相关阅读:
    Cookie操作
    C# 操作Cookie类
    面向对象之struct
    高薪程序员都避开了那些坑【安晓辉】
    [转]C#之反射
    [转]正则表达式相关:C# 抓取网页类(获取网页中所有信息)
    membership 在web.config中配置信息
    面向对象之virtual
    面向对象之多态
    JAVA面向对象 接口
  • 原文地址:https://www.cnblogs.com/-flq/p/10268064.html
Copyright © 2011-2022 走看看