搭配 GSON - GET 請求處理整體 JSON 陣列
以請求 https://api.github.com/events 這個 API 為例,其內容如下
[
{
"id": "3999090196",
"type": "WatchEvent",
"actor": {
"id": 11425338,
"login": "smalldu",
"gravatar_id": "",
"url": "https://api.github.com/users/smalldu",
"avatar_url": "https://avatars.githubusercontent.com/u/11425338?"
},
"repo": {
"id": 760732,
"name": "ccgus/fmdb",
"url": "https://api.github.com/repos/ccgus/fmdb"
},
"payload": {
"action": "started"
},
"public": true,
"created_at": "2016-05-11T08:39:28Z"
},
{
...其他 JSON 物件,這裡省略。
}
]
AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET" />
MainActivity.java
public class MainActivity extends Activity {
// 根據陣列中的 JSON 物件的 key,設定資料結構類別。
public class Event {
public String id;
public String type;
}
// 設定 uri
public interface ApiUri {
@GET("/events")
Call<List<Event>> getEvent();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com")
.addConverterFactory(GsonConverterFactory.create())
.build();
ApiUri apiUri = retrofit.create(ApiUri.class);
// 設定為 List<Event>,其會自動將 JSON 陣列轉為 List 結構,裡面每個元素就是 JSON 物件。
Call<List<Event>> call = apiUri.getEvent();
call.enqueue(new Callback<List<Event>>() {
@Override
public void onResponse(Call<List<Event>> call, Response<List<Event>> response) {
// 取得 JSON 陣列內容。
List<Event> eventGroup = response.body();
// 取得 JSON 陣列長度。
int size = eventGroup.size();
// 訪問 JSON 陣列中所有 JSON 物件。
for (int i = 0; i < size; i++) {
Log.d("MainActivity", eventGroup.get(i).id);
Log.d("MainActivity", eventGroup.get(i).type);
}
}
@Override
public void onFailure(Call<List<Event>> call, Throwable t) {
t.printStackTrace();
}
});
}
}