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());

    完成!!!

  • 相关阅读:
    Flutter form 的表单 input
    FloatingActionButton 实现类似 闲鱼 App 底部导航凸起按钮
    Flutter 中的常见的按钮组件 以及自 定义按钮组件
    Drawer 侧边栏、以及侧边栏内 容布局
    AppBar 自定义顶部导航按钮 图标、颜色 以及 TabBar 定义顶部 Tab 切换 通过TabController 定义TabBar
    清空路由 路由替换 返回到根路由
    应对ubuntu linux图形界面卡住的方法
    [转] 一块赚零花钱
    [转]在树莓派上搭建LAMP服务
    ssh保持连接
  • 原文地址:https://www.cnblogs.com/-flq/p/10268064.html
Copyright © 2011-2022 走看看