Разобрать вложенный JSON с помощью модернизации в Android - PullRequest
0 голосов
/ 18 июня 2019

Я получаю исключение нулевого указателя. Я хочу получить случайную цитату из этого API котировок - https://quotes.rest/ для отображения в моем приложении для Android. Куда я иду не так?

(Я прошу прощения, если я не задал вопрос должным образом или нарушил какие-либо правила, опубликовав вопрос. Я впервые задаю вопрос)

Я создал необходимые POJO и попытался получить предложение в MainActivity.

    GetDataService service = RetrofitClientInstance.getRetrofitInstance().create(GetDataService.class);

    Call<Example> call = service.getRandomQuote();

    call.enqueue(new Callback<Example>() {
        @Override
        public void onResponse(Call<Example> call, Response<Example> response) {

            String quote = response.body().getContents().getQuotes().get(0).getQuote();
            Log.d(TAG, "onResponse: ************" + quote);
        }

GetDataService

public interface GetDataService {
@GET("/quote/random")
Call<Example> getRandomQuote();
}

POJO- Цитата

public class Quote {

@SerializedName("quote")
private String quote;

public Quote(String quote) {
    this.quote = quote;
}

public String getQuote() {
    return quote;
}

public void setQuote(String quote) {
    this.quote = quote;
}
}

POJO- Содержание

public class Contents {

@SerializedName("quotes")
@Expose
private List<Quote> quotes;


public List<Quote> getQuotes() {
    return quotes;
}

public void setQuotes(List<Quote> quotes) {
    this.quotes = quotes;
}
}

POJO- Пример

public class Example {

@SerializedName("contents")
@Expose
private Contents contents;

public Contents getContents() {
    return contents;
}

public void setContents(Contents contents) {
    this.contents = contents;
}
}

класс RetrofitClientInstance

public class RetrofitClientInstance {

private static Retrofit retrofit = null;
private static  final String BASE_URL = "https://quotes.rest";

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

Я ожидаю, что выходные данные будут случайными кавычками из этого API котировок (https://quotes.rest/), но я получаю исключение нулевого указателя. Ниже приведена ошибка-

java.lang.NullPointerException: Attempt to invoke virtual method 'com.platinumstudio.contactsdemo7.network.Contents com.platinumstudio.contactsdemo7.Example.getContents()' on a null object reference
    at     com.platinumstudio.contactsdemo7.MainActivity$3.onResponse(MainActivity.java)

Ответы [ 4 ]

1 голос
/ 18 июня 2019

API, который вы здесь используете, это это . Как сказано в документации API, для получения данных требуется ключ API. Поскольку вы не добавили ключ API в свои коды, он должен вернуть неудачный ответ с HTTP Status Code из 401.

И всегда рекомендуется проверять, успешен ли ответ, прежде чем приступить к выполнению операций с полученными данными, чтобы избежать сбоев в приложении. Всегда сохраняйте этот фрагмент кода при извлечении данных из API:

call.enqueue(new Callback<Example>() {
        @Override
        public void onResponse(Call<Example> call, Response<Example> response) {
                if(response.isSuccessful && response.body() != null){
                    //Get contents & quote
                }
                else {
                    //Check response code & show the relevant error message through Toast or Dialog
                }
        }

        @Override
        public void onFailure(Call call, Throwable t) {
                //Show a failed message to the user
        }
}
0 голосов
/ 18 июня 2019

Для этого API требуется Authorization key для доступа к данным.Следовательно, измените ваш интерфейс GetDataService, как показано ниже:

public interface GetDataService {
@GET("/quote/random/")
Call<Example> getRandomQuote(@HeaderMap Map<String, String> headerMap);

}

//HeaderMap will have authorization key and its value as <Key,Value> pair.
0 голосов
/ 18 июня 2019

https://theysaidso.com/api/ На веб-сайте API вы найдете ссылку для доступа к цитате случайного пользователя

вот ссылка:

http://quotes.rest/quote/random.json?api_key=

без ключа вы получите Несанкционированный доступ

0 голосов
/ 18 июня 2019

Я считаю, что вам нужно добавить ключ Api к вашему запросу, иначе вы не сможете получить доступ к данным.Следовательно, тело вашего ответа является нулевым, что вызывает сбой.Как говорится на сайте:

For using the private end points and subscribing to the API please visit https://theysaidso.com/api.
...