今天服务器端的所有接口终于写好了, 用了半个小时把所有访问百度的链接都换成自己的服务器的接口地址, 主要问题有json数据的解析和处理url中含中文的情况
一、json数据解析
-
首先是教室数据, 这部分数据是一个json数组, 其中每一项都是一条教室数据, 而且设置ListView的时候已经写好了Room类, 最适合用google提供的GSON库来解析了
- 首先在app的build.gradle中导入GSON的库
implementation 'com.google.code.gson:gson:2.2.4'
- 用法也是非常的简单
Gson gson = new Gson(); List<Room> roomListTmp = gson.fromJson(data1, new TypeToken<List<Room>>(){ }.getType()); roomList.clear(); roomList.addAll(roomListTmp);
-
然后是其他的响应信息, 以获取用户信息为例, 这部分信息简短且结构不固定, 有响应状态字段, 例如:
{
"station":"success",
"info":{
"Suser":"康纳","Stel":"11111111111","Semail":"[email protected]"}
}
这样的数据就不用很麻烦的写一个类来存储了, 用Android提供的JSONObject来解析比较方便, JSONObject对象接收一个json字符串来初始化, 然后就可以用get方法根据key值获得value, 仍然是一个json字符串的value可以用来继续初始化JSONObject
String result = response.body().string();
try{
JSONObject data = new JSONObject(result);
String station = data.getString("station");
if (station.equals("success")){
JSONObject userInfo = new JSONObject(data.getString("info"));
final String userName = userInfo.getString("Suser");
String userEmail = userInfo.getString("Semail");
SharedPreferences.Editor editor = spf.edit();
editor.putString("name", userName);
editor.putString("email", userEmail);
editor.apply();
runOnUiThread(new Runnable() {
@Override
public void run() {
navUserName.setText(userName);
}
});
}
}catch (Exception e){
Log.d("bug", e.toString());
}
}
二、处理url中含中文的情况
get方式请求的url中含有中文时需要对其进行编码, 和服务器的编码方式一致
String nameInput = input.getText().toString();
String name = URLEncoder.encode(nameInput,"utf-8");