解析JSON数据-JSONObject以及GSON

解析JSON数据


JSON数据是我们平时很常见的返回数据了,我们来看一串JSON数据的样式:

{
  "code": "200",
  "updateTime": "2020-12-24T09:52+08:00",
  "fxLink": "http://hfx.link/2bc4",
  "now": {
    "pubTime": "2020-12-24T09:00+08:00",
    "aqi": "199",
    "level": "4",
    "category": "中度污染",
    "primary": "PM2.5",
    "pm10": "124",
    "pm2p5": "149",
    "no2": "94",
    "so2": "11",
    "co": "1.5",
    "o3": "10"
  },
	"station": [
    {
      "pubTime": "2020-12-24T09:00+08:00",
      "name": "浦东张江",
      "id": "CNA1150",
      "aqi": "172",
      "level": "4",
      "category": "中度污染",
      "primary": "PM2.5",
      "pm10": "96",
      "pm2p5": "130",
      "no2": "101",
      "so2": "12",
      "co": "1.4",
      "o3": "5"
    }
    ]
}

很经典的一串JSON数据,其中有" { } “还有” [ ] ",这都需要我们用不同的方式来解析,这串数据就是调用和风天气API所返回的数据,有想要自己实践的参考下面的API网址:

"https://devapi.qweather.com/v7/air/now?location=**&key=**"

location位置是查询地点的LocID,key是自己在和风天气申请的,那么接下来我们就用两种不同方式进行JSON数据的解析。

使用JSONObject进行解析

这种解析方法很常见了,我之前一直都是用这种和方法的,适用于只需要解析某几个数据的情况,例如我们需要上面的" pm2p5 "数据而不需要其他的,这种情况用JSONObject就会简单很多,我们来介绍一下这种方法:

我们假定需要解析三个数据:
1.now.pm2p5
2.station.name
3.station.pm2p5
这三个数据,由于存在" { } “还有” [ ] ",因此解析的方法是不一样的,我们依次来试一下:

针对" { } "进行的JSONObject解析

{
  "code": "200",
  "updateTime": "2020-12-24T09:52+08:00",
  "fxLink": "http://hfx.link/2bc4",
  "now": {
    "pubTime": "2020-12-24T09:00+08:00",
    "aqi": "199",
    "level": "4",
    "category": "中度污染",
    "primary": "PM2.5",
    "pm10": "124",
    "pm2p5": "149",
    "no2": "94",
    "so2": "11",
    "co": "1.5",
    "o3": "10"
  }
}

截取了其中的一块,我们可以看到这个JSON数据是整体在 { } 中的,而now.pm2p5又是在一个新的 { } 中,关于获取这一部分我们就不说了,上一篇博客中我们介绍了OkHttp,已经获取过了,详细的可以参考一下:

简要学习记录OkHttp

我们已经获取到了这串JSON数据,并且将它转化为字符串data数据,那么首先我们将data数据传入到JSONObject中才能进行解析:

JSONObject jsonObject = new JSONObject(data);

这样就很轻松的讲JSON数据转化的String变量传入到了JSONObject中,接下来是第一步解析,拆开大括号 { ,获取now的位置:

JSONObject jsonData = jsonObject.getJSONObject("now");

我们可以理解为每一个 { } 都是一个JSONObject,now同样也是,所以我们采用另一个JSONObject进行接受这个新的 { } ,也就是now { },这个时候jsonData代表的就是now { } 里面的那些数据,不存在" { } “还有” [ ] "了,可以直接进行解析,我们来拿到pm2p5这个数据:

String nowPm2p5 = jsonData.getString("pm2p5");
Log.d(TAG, "现在的pm2.5 :" + js);

我们来看一下运行打出的log:
在这里插入图片描述

针对" [ ] "进行的JSONObject解析

没有问题,那么接下来我们需要解析的是station.name 以及 station.pm2p5,这部分和上一部分区别就在于是存在了 [ ] 这一部分,因此解析方法也会有变化,我们先来截取这一串数据看看:

{
"station": [
    {
      "pubTime": "2020-12-24T09:00+08:00",
      "name": "浦东张江",
      "id": "CNA1150",
      "aqi": "172",
      "level": "4",
      "category": "中度污染",
      "primary": "PM2.5",
      "pm10": "96",
      "pm2p5": "130",
      "no2": "101",
      "so2": "12",
      "co": "1.4",
      "o3": "5"
    }
    ]
}

[ ] 这部分代表的是数组,自然不能直接用JSONObject操作,我们可以简要理解为JSONObject负责解析 { } 这一部分,JSONArray负责解析 [ ] 这一部分,data数据我们已经在上面说过了,目前是字符串数据,接下来我们进行获取station.name 以及 station.pm2p5:

JSONObject jsonObject = new JSONObject(data);
JSONArray jsonArray = jsonObject.getJSONArray("station");
JSONObject stationObject = jsonArray.getJsonObject("0");
String stationName = stationObject.getString("name");
String stationPm2p5 = stationObject.getString("pm2p5");

来看一下上面的代码,其实很好理解,station是一个 [ ] 也就是数组数据,我们用JSONArray进行获取,station数组中存在 { } 数据,我们用JSONObject进行获取,需要注意的是JSONArray的getJSONObject()方法,是需要传入int型参数的,代表的是数组数据的下标,从0开始,接下来的解析就和之前一样了,我们来看一下输出:

在这里插入图片描述
没想到我写代码的这阵子Pm2.5就已经变了,好快的速度,那么用JSONObject解析数据我们就写到这里结束了;

GSON

JSONObject是我一直在用的,不过在获取很多数据的时候,就很麻烦很麻烦,几乎每个数据都要写一遍获取流程,就是get…get…这个过程,很烦,听别人说GSON在获取多个数据的时候很方便,那么我也来学一下:

在Android官方并没有配置GSON的依赖,这需要我们自己添加:

compile 'com.google.code.gson:gson:2.6.2'

随便添加的,我用东西不喜欢用最新版,可能会出问题,依赖添加完成后,GSON就已经导入到我们的项目中了,对于GSON,我们需要建立一个关于返回JSON数据的Bean类,很复杂,要根据数据考虑所有类型,对于一个复杂的JSON数据,可能Bean类就要花费很久,因此提供了GSONFormat插件,接下来我们来介绍一下它的安装以及使用:

GSONFormat安装使用

1.进行GSONFormat的引入:
在这里插入图片描述
在这里插入图片描述
搜索GOSNFormat,会出现一个install,选中,Apply,OK即可,我已经安装过了,所以没有install选项;

2.新建Bean类,在类中 Alt + Insert ,选中GSONFormat,
在这里插入图片描述
在这里插入图片描述
OK即可,会自动生成所需的Bean类,OVER!。
在这里插入图片描述
看Bean类中的边量以及函数,可以初步推断出,
1.键值对在Bean类中作为变量,

"code": "200",
  "updateTime": "2020-12-24T09:52+08:00",
  "fxLink": "http://hfx.link/2bc4",

对应的代码为:

private String code;
    private String updateTime;
    private String fxLink;

2.{ } 对象在Bean类中作为一个新的 " *Bean "类,

"now": {
    "pubTime": "2020-12-24T09:00+08:00",
    "aqi": "199",
    "level": "4",
    "category": "中度污染",
    "primary": "PM2.5",
    "pm10": "124",
    "pm2p5": "149",
    "no2": "94",
    "so2": "11",
    "co": "1.5",
    "o3": "10"
  },

在代码中对应的就是:

private NowBean now;

public static class NowBean {
        private String pubTime;
        private String aqi;
        private String level;
        private String category;
        private String primary;
        private String pm10;
        private String pm2p5;
        private String no2;
        private String so2;
        private String co;
        private String o3;
        ***
}

3.“ [ ] ” 对象在Bean类中作为泛型列表变量:

"station": [
    {
      "pubTime": "2020-12-24T09:00+08:00",
      "name": "浦东张江",
      "id": "CNA1150",
      "aqi": "172",
      "level": "4",
      "category": "中度污染",
      "primary": "PM2.5",
      "pm10": "96",
      "pm2p5": "130",
      "no2": "101",
      "so2": "12",
      "co": "1.4",
      "o3": "5"
    }
    ]

在代码中对应的是:

private List<StationBean> station;

public static class StationBean {
       	private String pubTime;
        private String name;
        private String id;
        private String aqi;
        private String level;
        private String category;
        private String primary;
        private String pm10;
        private String pm2p5;
        private String no2;
        private String so2;
        private String co;
        private String o3;
        ***
}

对于 " [ ] " 这种JSON数据,一般内部的JSON数据都是重复的,只是value值不同,因此只需要写一个stationBean类,作为泛型传递,根据循环就可以依次提取出不同的value值。

GSON解析JSON数据

在获取了JSON数据以及生成了Bean类之后,我们就可以在代码中进行相应的实现了,你会发现一切是那么的简单快捷,不需要一步一步的解析,只需要调用一个一个的函数:

在之前已经讲JSON数据转化为String字符串data的基础上进行:

GSON gson = new GSON();
WeatherBean weatherBean = gson.fromJson(data , WeatherBean.class);
String js = weatherBean.getnow().getPm2p5();
String stationName = weatherBean.getStation().get(0).getName();
String stationPm2p5 = weatherBean.getStation().get(0).getPm2p5();

是不是很简单了?芜湖,起飞,运行结果也没有问题:
在这里插入图片描述
有一说一,这个上海的浦东张江,环境这么好的么,获取到的时候我还以为解析错了,pm2.5为0,上午还130呢,离谱,好了,就到这了,回顾一下再实践一下巩固巩固。就这样了。

在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值