在对象内部修改创建请求

时间:2019-07-01 12:43:35

标签: android retrofit2

我正在尝试从https://yts.lt/api/v2/list_movies.json

获取数据

这是我的代码:

series: [{
        data: [{
                y: 9.5,
            MYVALUE: 95
        }],
        dataLabels: {
            format: '<div style="text-align:center"><span style="font-size:25px;color:' +
                ((Highcharts.theme && Highcharts.theme.contrastTextColor) || 'black') + '">{MYVALUE}</span><br/>' +
                   '<span style="font-size:12px;color:silver"></span></div>'
        },
    }]

主要活动:

public class ApiClient {


    private final static String DOMAIN = "https://yts.lt/api";
    private final static String API = "/v2/list_movies.json/";

    private final static String BASE_URL = String.format("%s%s", DOMAIN, API);


    private static Retrofit retrofit = null;

    //Retrofit
    public static Retrofit getInstance() {
        if (retrofit == null) {
            retrofit = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return retrofit;
    }
}


public interface ApiService {

    //how to create the GET?

    @GET("all")
     Single<List<Movie>> getAllMovies();
}

电影:

public class MainActivity extends AppCompatActivity {

    private ApiService apiService;
    private CompositeDisposable mDisposable;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDisposable = new CompositeDisposable();
        apiService = ApiClient.getInstance().create(ApiService.class);


        mDisposable.add(apiService.getAllMovies().
                subscribeOn(Schedulers.io()).
                observeOn(AndroidSchedulers.mainThread()).
                subscribeWith(new DisposableSingleObserver<List<Movie>>() {


                    @Override
                    public void onSuccess(final List<Movie> movies) {


                        Log.d(TAG,"Sucess");

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(TAG, String.format("onError: %s", e.getMessage()), e);

                    }
                })
        );
    }
}

错误:

public class Movie implements Serializable {

    @SerializedName("title")
    private String title;


    public String getNameTitle() {
        return title;
    }


}

电影数组位于对象►数据►电影► 我需要得到吗?你能帮我如何创建@GET

2 个答案:

答案 0 :(得分:1)

您的端点返回类型的结构不正确。它应具有与端点响应相同的结构。您应该创建以下类:


class MoviesResponse {
   @SerializedName("data")
   MoviesData data;
   ...
}

class MoviesData {
   @SerializedName("movies")
   List<Movie> data;
   ...
}

class Movie {
   @SerializedName("title")
   String title;
   ...
}

请注意,您应该在每个类中添加所需的属性,例如,在MoviesResponse中,您还可以像在JSON响应中一样添加status字段。

然后将您的服务更改为具有返回类型的MoviesResponse

public interface ApiService {

     @GET("all")
     Single<MoviesResponse> getAllMovies();
}

答案 1 :(得分:1)

好吧,我认为您需要稍微搜索一下如何使用GSON解析JSON。

StackOverflow上有很多很好的答案。

您将需要在迭代Array时选择性地解析所需内容并构造Movie对象,或者创建代表JSON给定的上述结构的所有模型对象,并让GSON解析为您的对象。

您不能做的事都不是以上两者。

通过“快速”查看您的JSON(我讽刺地说是因为它巨大……),我可以看到它的结构是这样的:

类为(),字段为lower_case

ResponseRoot()
  status,
  status_message
  Data()
     limit,
     movie_count, 
     etc.,
     MoviesList() 
          Movie()
              id, url, etc..
              Genres() //this is a List<String> from what I see
              Torrents() // list<Torrent>
              date_uploaded,
              date_uploaded_unix
          Movie()
          Movie()
          Movie()
          ...

像这样的金田。因此,当事物是JSON数组时,java中的等效项就是List。

ofThatThing是您必须在字段中提供的类。

例如:

上述用于Movie的“伪类”看起来像:(简化,我没有复制所有字段)

class Movie {
   int id;
   String url;
   String imdb_code;
   ...
   List<String> genres;
   String summary;
   List<Torrent> torrents;
}

您需要拥有Torrent对象,以便...

class Torrent {
   String url;
   String hash;
   String quality;
   etc..
}

您明白了。