MovieGlu API。改造2:预计是BEGIN_ARRAY,但在第1行第2列路径是BEGIN_OBJECT。

问题描述 投票:0回答:1

我试图用MovieGlu API返回数据,但当我运行我的应用程序时,我得到以下错误。

Retrofit 2: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $1.

MainActivity.class

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());
            }
        });


    }
}

电影.java

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;
    }
}

Api.java(接口)

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();
}

返回的JSON

{
    "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",而不是一次显示所有的对象。

java android json api
1个回答
1
投票

定义一个类 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()); 
       }
 });
© www.soinside.com 2019 - 2024. All rights reserved.