我试图用MovieGlu API返回数据,但当我运行我的应用程序时,我得到以下错误。
Retrofit 2: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $1.
package com.example.retrofitapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.io.IOException;
import java.util.List;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
private TextView textViewResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textViewResult = findViewById(R.id.text_view_result);
OkHttpClient.Builder client = new OkHttpClient.Builder();
client.addInterceptor(new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.addHeader("api-version", "v200")
.addHeader("Authorization", "Basic *********************")
.addHeader("client", "CLIENT")
.addHeader("x-api-key", "*****************************")
.addHeader("device-datetime", "2018-09-14T08:30:17.360Z")
.addHeader("territory", "UK")
.build();
return chain.proceed(request);
}
});
Retrofit retrofit = new Retrofit.Builder()
.addConverterFactory(GsonConverterFactory.create())
.baseUrl("https://api-gate2.movieglu.com/")
.client(client.build())
.build();
MovieGluApi movieGluApi = retrofit.create(MovieGluApi.class);
Call<List<Films>> call = movieGluApi.getFilmNames();
call.enqueue(new Callback<List<Films>>() {
@Override
public void onResponse(Call<List<Films>> call, Response<List<Films>> response) {
if (!response.isSuccessful()){
textViewResult.setText("Code: " + response.code());
return;
}
List<Films> films = response.body();
for (Films film : films){
String content = "";
content += "Films: " + film.getFilmName() +"\n";
content += "Film ID: " + film.getFilmId() +"\n";
content += "IMDB ID: " + film.getImdbId() +"\n";
content += "Film Name: " + film.getFilmName() +"\n\n";
textViewResult.append(content);
}
}
@Override
public void onFailure(Call<List<Films>> call, Throwable t) {
textViewResult.setText(t.getMessage());
}
});
}
}
package com.example.retrofitapp;
import java.util.ArrayList;
public class Films {
private int filmId;
private int imdbId;
private String filmName;
//private ArrayList releaseDates;
public int getFilmId() {
return filmId;
}
public int getImdbId() {
return imdbId;
}
public String getFilmName() {
return filmName;
}
}
package com.example.retrofitapp;
import java.text.DateFormat;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
public interface MovieGluApi {
@GET("filmsNowShowing/?n=1")
Call<List<Films>> getFilmNames();
}
{
"films": [
{
"film_id": 3139,
"imdb_id": 112641,
"film_name": "Casino",
"release_dates": [
{
"release_date": "1995-11-28",
"notes": "GBR"
}
],
"age_rating": [
{
"rating": "18 ",
"age_rating_image": "https://assets.movieglu.com/age_rating_logos/uk/18.png",
"age_advisory": "strong violence"
}
],
"film_trailer": null,
"synopsis_long": "Robert DeNiro, Sharon Stone and Joe Pesci star in director Martin Scorsese's riveting look at how blind ambition, white-hot passion and 24-karat greed toppled an empire. Las Vegas 1973 is the setting for this fact-based story about the Mob's multi-million dollar casino operation - where fortunes and lives were made and lost with a roll of the dice.",
"images": {
"poster": {
"1": {
"image_orientation": "portrait",
"region": "global",
"medium": {
"film_image": "https://image.movieglu.com/3139/003139h1.jpg",
"width": 199,
"height": 300
}
}
}
}
}
],
"status": {
"count": 1,
"state": "OK",
"method": "filmsNowShowing",
"message": null,
"request_method": "GET",
"version": "WALS_0v200",
"territory": "UK",
"device_datetime_sent": "2020-05-17T08:30:17.360Z",
"device_datetime_used": "2020-05-17 08:30:17"
}
}
我希望能够在文本视图中逐一显示单个对象的结果,例如:"film_name": "Casino",而不是一次显示所有的对象。
定义一个类 Test
class Test{
List<Films> films;
public List<Films> getFilms(){return films;}
public void setFilms(List<Films> f){films=f;}
}
修改代码中的改造部分:凡是 List<Films>
在那里,把 Test
. 修改代码,相应更新文本视图。
Call<Test> call = movieGluApi.getFilmNames();
call.enqueue(new Callback<Test>() {
@Override
public void onResponse(Call<Test> call,Response<Test> response) {
if (!response.isSuccessful()){
textViewResult.setText("Code: " + response.code());
return;
}
List<Films> films =response.body().getFilms();
for (Films film : films){
String content = "";
content += "Films: " + film.getFilmName() +"\n"; content += "Film ID: " + film.getFilmId() +"\n";
content += "IMDB ID: " + film.getImdbId() +"\n";
content += "Film Name: " + film.getFilmName() +"\n\n";
textViewResult.append(content);
}
}
@Override
public void onFailure(Call<Test> call, Throwable t {
textViewResult.setText(t.getMessage());
}
});