【AndroidDevelop 04】解析JSON数据详解

JSON结构化表示很容易展示信息,并且具备容易在网络上传输的特点,所以在数据交换中十分常用。

首先认识一下JSON数据格式:

js 复制代码
"HeWeather": [
        {
            "basic": {
                "cid": "CN101190401",
                "location": "苏州",
                "parent_city": "苏州",
                "admin_area": "江苏",
                "cnty": "中国",
                "lat": "43.88684082",
                "lon": "125.32450104",
                "tz": "+8.00",
                "city": "苏州",
                "id": "CN101190401",
                "update": {
                    "loc": "2024-04-06 02:36",
                    "utc": "2024-04-06 02:36"
                }
            },
            "status": "ok",
        }]

所示为一个天气预报请求数据的示例。

那么我们得到服务器返回的JSON对象后,该如何使用呢?

  • JSONObject

    这是官方提供的方法,可以将从服务器得到的JSON字符串转换为JSON Object对象,底层原理是Map。也就是说,该方法将合法格式的JSON字符串转换为map实例,所以用法也显而易见。

java 复制代码
    //如果得到的是JSON数组数据jsonData:
    JSONArray jsonArray = new JSONArray
    (jsonData);
    for(int i = 0; i < jsonArray.length();i++){
    JSONObject jsonObject = jsonArray.getJSONObject(i);
    String status = jsonObject.getString("status")
    JSONObject basicObject = new JSONObject(jsonObject.getJSONObject);
    String cid = basicObject.opt("cid");
    }
  • GSON

    来自于google的开源库,比JSONObject用起来更简单。不过GSON没有被添加到Android官方的API中,想要使用,必须先引入依赖。

arduino 复制代码
implementation 'com.google.code.gson:gson:2.8.9'

先来说说为什么用到GSON会更方便,如上图所示,使用JSONObject方法需要不断手动解析对象,实在是麻烦。而GSON提供了将JSON转换为java对象的功能,从而不需要我们手动地去编写代码解析。

java 复制代码
//假设得到的json数据为:
/* {"name" : "YesP", "age":20} 那么我们可以定义一个Person类,加入name和age两个字段*/
Gson gson = new Gson();
Person person = gson.fromJson(jsonData, Person.class);

//如果得到的是json数组数据:
List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>(){}.getType());

关于new TypeToken:blog.csdn.net/jiangyu1013...

java 复制代码
//示例 由于basic的值依旧是一个json对象,所以还需要再定一个basic类
public class Weather {
    public String status;
    public Basic basic;
}

public class Basic {

    @SerializedName("city")
    public String cityName;

    @SerializedName("id")
    public String weatherId;

    public Update update;

    public class Update {
        @SerializedName("loc")
        public String updateTime;
    }

}
java 复制代码
//在activity中的用法:
//与jsonObject配合使用
JSONObject jsonObject = new JSONObject(jsonData);
JSONArray jsonArray = jsonObject.getJSONArray("HeWeather");
String weatherContent = jsonArray.getJSONObject(0).toString();
//由于数组里只有一个数据,所以用0就好
Gson gson =  new Gson();
Weather weather = gson.fromJson(weatherContent, Weather.class);

//例子:获取weatherId
String weatherId = weather.basic.weatherId;
相关推荐
Mckay883 小时前
android studio导入项目
android·ide·android studio
是店小二呀5 小时前
【优选算法 | 字符串】字符串模拟题精选:思维+实现解析
android·c++·算法
Chandler245 小时前
Go语言:json 作用和语法
开发语言·golang·json
奔跑吧 android6 小时前
【android bluetooth 协议分析 12】【A2DP详解 1】【车机侧蓝牙音乐免切源介绍】
android·bluetooth·bt·gd·a2dpsink·免切源·aosp14
飞猿_SIR7 小时前
Android Exoplayer多路不同时长音视频混合播放
android·音视频
前端懒猫7 小时前
android实现USB通讯
android
jiet_h8 小时前
Android锁
android
Hfc.13 小时前
docker-daemon.json
docker·容器·json
teacher伟大光荣且正确17 小时前
Qt Creator 配置 Android 编译环境
android·开发语言·qt
飞猿_SIR19 小时前
Android Exoplayer 实现多个音视频文件混合播放以及音轨切换
android·音视频