【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;
相关推荐
CYRUS_STUDIO4 小时前
Frida 检测与对抗实战:进程、maps、线程、符号全特征清除
android·逆向
csj505 小时前
安卓基础之《(28)—Service组件》
android
lhbian7 小时前
PHP、C++和C语言对比:哪个更适合你?
android·数据库·spring boot·mysql·kafka
catoop8 小时前
Android 最佳实践、分层架构与全流程解析(2025)
android
ZHANG13HAO9 小时前
Android 13 特权应用(Android Studio 开发)调用 AOSP 隐藏 API 完整教程
android·ide·android studio
田梓燊9 小时前
leetcode 142
android·java·leetcode
angerdream9 小时前
Android手把手编写儿童手机远程监控App之JAVA基础
android
菠萝地亚狂想曲10 小时前
Zephyr_01, environment
android·java·javascript
sTone8737510 小时前
跨端框架通信机制全解析:从 URL Schema 到 JSI 到 Platform Channel
android·前端
sTone8737510 小时前
Java 注解完全指南:从 "这是什么" 到 "自己写一个"
android·前端