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;