移动应用开发实践-Task3-Gson的基础应用
- 目标
在Task2的基础上,分别使用以下三个方法,将json对象配置为自定义java类。
- json的单个获取
- gson的单个获取
- gson的列表获取
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
1. 配置gson(和之前配置OkHttp一样)
2.做一个带ListView的获取页面
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请在下方输入URL" />
<EditText
android:id="@+id/et_url"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:text="http://guolin.tech/api/china" />
<Button
android:id="@+id/bt_json_array"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="By Json" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button
android:id="@+id/bt_v1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Gson V1" />
<Button
android:id="@+id/bt_v2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Gson V2" />
</LinearLayout>
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/tv_ack"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="" />
</LinearLayout>
</ScrollView>
</LinearLayout>
3.简单创建一个City对象
package com.example.fyn_weather_task3_0.data;
public class City {
private int id;
private String name;
public City(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return String.format("%s-id=%d",name,id);
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
alt + insert 可以直接唤出基本类方法的快速添加,自定义类时可以节约时间
4.将json对象转为自定义对象的三个方法
- json的单个获取(常用方法)
private ArrayList<City> parseJsonCityByArray(String s) {
// 创建存放City的列表
ArrayList<City> cityList = new ArrayList<>();
try {
//创建json列表,传参s就是我们的网页数据
JSONArray jsonArray = new JSONArray(s);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
//获取json列表每个对象的id和name
int id = jsonObject.getInt("id");
String name = jsonObject.getString("name");
//通过构造函数创建city对象放入列表
City city = new City(id, name);
cityList.add(city);
}
} catch (JSONException e) {
e.printStackTrace();
}
return cityList;
}
- gson的单个获取(gson单个json目标转换的简单应用)
private ArrayList<City> parseGsonCityByArrayV1(String s) {
// 创建存放City的列表
ArrayList<City> cityList = new ArrayList<>();
try {
//创建json列表,传参s就是我们的网页数据
JSONArray jsonArray = new JSONArray(s);
for (int i = 0; i < jsonArray.length(); i++) {
//将jsonArray中的object转为String类型
String s1 = jsonArray.get(i).toString();
// gson直接将string对象转为city类型
// Gson().fromJson(被转换对象,转换对象类型)
City city = new Gson().fromJson(s1, City.class);
cityList.add(city);
}
} catch (JSONException e) {
e.printStackTrace();
}
return cityList;
}
- gson的列表获取 (主要要学的,整体转换)
private ArrayList<City> parseGsonCityByArrayV2(String s) {
ArrayList<City> cityList = new ArrayList<>();
if (!TextUtils.isEmpty(s)) {
try {
// 新建一个Type类型 List<City> 为type (存放City的列表这个类型)
Type type = new TypeToken<List<City>>() {
}.getType();
//直接转换
cityList = new Gson().fromJson(s, type);
} catch (JsonSyntaxException e) {
e.printStackTrace();
}
}
return cityList;
}
下面是MainActivity的完整代码
package com.example.fyn_weather_task3_0;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import com.example.fyn_weather_task3_0.data.City;
import com.example.fyn_weather_task3_0.utility.HttpUtil;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
EditText editText;
ArrayAdapter<City> adapter;
ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_main);
editText = findViewById(R.id.et_url);
listView = findViewById(R.id.listView);
Button button = findViewById(R.id.bt_json_array);
Button button1 = findViewById(R.id.bt_v1);
Button button2 = findViewById(R.id.bt_v2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = editText.getText().toString().trim();
HttpUtil.getOkHttpAsync(MainActivity.this, url, new HttpUtil.SimpleAsyncCall() {
@Override
public void onFailure(String e) {
}
@Override
public void onResponse(String s) {
ArrayList<City> list = parseJsonCityByArray(s);
updateListView(list);
}
});
}
});
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = editText.getText().toString().trim();
HttpUtil.getOkHttpAsync(MainActivity.this, url, new HttpUtil.SimpleAsyncCall() {
@Override
public void onFailure(String e) {
}
@Override
public void onResponse(String s) {
ArrayList<City> list = parseGsonCityByArrayV1(s);
updateListView(list);
}
});
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = editText.getText().toString().trim();
HttpUtil.getOkHttpAsync(MainActivity.this, url, new HttpUtil.SimpleAsyncCall() {
@Override
public void onFailure(String e) {
}
@Override
public void onResponse(String s) {
ArrayList<City> list = parseGsonCityByArrayV2(s);
updateListView(list);
}
});
}
});
}
//更新ListView内容
private void updateListView(ArrayList<City> list) {
adapter = new ArrayAdapter<>(this, android.R.layout.simple_expandable_list_item_1, list);
listView.setAdapter(adapter);
}
private ArrayList<City> parseJsonCityByArray(String s) {
// 创建存放City的列表
ArrayList<City> cityList = new ArrayList<>();
try {
//创建json列表,传参s就是我们的网页数据
JSONArray jsonArray = new JSONArray(s);
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
//获取json列表每个对象的id和name
int id = jsonObject.getInt("id");
String name = jsonObject.getString("name");
//通过构造函数创建city对象放入列表
City city = new City(id, name);
cityList.add(city);
}
} catch (JSONException e) {
e.printStackTrace();
}
return cityList;
}
private ArrayList<City> parseGsonCityByArrayV1(String s) {
// 创建存放City的列表
ArrayList<City> cityList = new ArrayList<>();
try {
//创建json列表,传参s就是我们的网页数据
JSONArray jsonArray = new JSONArray(s);
for (int i = 0; i < jsonArray.length(); i++) {
//将jsonArray中的object转为String类型
String s1 = jsonArray.get(i).toString();
// gson直接将string对象转为city类型
// Gson().fromJson(被转换对象,转换对象类型)
City city = new Gson().fromJson(s1, City.class);
cityList.add(city);
}
} catch (JSONException e) {
e.printStackTrace();
}
return cityList;
}
private ArrayList<City> parseGsonCityByArrayV2(String s) {
ArrayList<City> cityList = new ArrayList<>();
if (!TextUtils.isEmpty(s)) {
try {
// 新建一个Type类型 List<City> 为type (存放City的列表这个类型)
Type type = new TypeToken<List<City>>() {
}.getType();
//直接转换
cityList = new Gson().fromJson(s, type);
} catch (JsonSyntaxException e) {
e.printStackTrace();
}
}
return cityList;
}
}