【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;
相关推荐
Cao_Shixin攻城狮3 小时前
Flutter运行Android项目时显示java版本不兼容(Unsupported class file major version 65)的处理
android·java·flutter
呼啦啦呼啦啦啦啦啦啦6 小时前
利用pdfjs实现的pdf预览简单demo(包含翻页功能)
android·javascript·pdf
idjl7 小时前
Mysql测试题
android·adb
游戏开发爱好者810 小时前
iOS App 电池消耗管理与优化 提升用户体验的完整指南
android·ios·小程序·https·uni-app·iphone·webview
人生游戏牛马NPC1号10 小时前
学习 Flutter (四):玩安卓项目实战 - 中
android·学习·flutter
星辰也为你祝福h12 小时前
Android原生Dialog
android
梁同学与Android13 小时前
Android ---【CPU优化】需要优化的原因及优化的地方
android
stoneSkySpace13 小时前
set、map 比数组,json 对象的性能更好原因分析
json
Misha韩13 小时前
React Native 基础tabBar和自定义tabBar - bottom-tabs
android·react native
iHero14 小时前
【Nextcloud】在 Ubuntu 22.04.3 LTS 上的 Nextcloud Hub 10 (31.0.2) 后台任务cron 的优化
android·linux·ubuntu·nextcloud