Почему не работает метод onResponse? Библиотека Retrofit2

Я хочу получить с помощью GET список строк Json, используя библиотеки Retrofit2 и Gson. Когда я выполняю GET из .../titlefaqsjson?_format=json с помощью POSTMAN, я получаю Json следующим образом:

[
{
    "tid": [
        {
            "value": 27
        }
    ],
    "uuid": [
        {
            "value": "b3d3c5bb-6a8b-40c1-bafe-d4ddf3a45ff3"
        }
    ],
    "langcode": [
        {
            "value": "en"
        }
    ],
    "vid": [
        {
            "target_id": "faq",
            "target_type": "taxonomy_vocabulary",
            "target_uuid": "a225614a-917b-4b0d-861b-9113d5a47fa3"
        }
    ],
    "name": [
        {
            "value": "Buscar una SocialFood"
        }
    ],
    "description": [
        {
            "value": null,
            "format": null,
            "processed": ""
        }
    ],
    "weight": [
        {
            "value": 0
        }
    ],
    "parent": [],
    "changed": [
        {
            "value": "2018-05-31T11:42:24+00:00",
            "format": "Y-m-d\\TH:i:sP"
        }
    ],
    "default_langcode": [
        {
            "value": true
        }
    ],
    "path": [
        {
            "alias": "/faq/soy-socialguest/buscar-una-socialfood",
            "pid": 35,
            "langcode": "en"
        }
    ]
},
{
    "tid": [
        {
            "value": 28
        }
    ],
    "uuid": [
        {
            "value": "e2d05fc8-840c-4cc2-8df2-2cd2bf45ee85"
        }
    ],
    "langcode": [
        {
            "value": "en"
        }
    ],
    "vid": [
        {
            "target_id": "faq",
            "target_type": "taxonomy_vocabulary",
            "target_uuid": "a225614a-917b-4b0d-861b-9113d5a47fa3"
        }
    ],
    "name": [
        {
            "value": "Cancelar una reserva antes de la SocialFood"
        }
    ],
    "description": [
        {
            "value": null,
            "format": null,
            "processed": ""
        }
    ],
    "weight": [
        {
            "value": 1
        }
    ],
    "parent": [],
    "changed": [
        {
            "value": "2018-05-31T11:53:54+00:00",
            "format": "Y-m-d\\TH:i:sP"
        }
    ],
    "default_langcode": [
        {
            "value": true
        }
    ],
    "path": [
        {
            "alias": "/faq/soy-socialguest/cancelar-una-reserva-antes-de-la-socialfood",
            "pid": 36,
            "langcode": "en"
        }
    ]
}, etc..

У меня есть интерфейс, в котором я объявляю GET следующим образом:

public interface ApiSocialFood {
   @GET("titlefaqsjson?_format=json")
   Call<ResponseFaqs> faqs();
}

Класс объекта ResponseFaqs - это простой класс со списком строк в качестве атрибута, конструктором и соответствующими методами получения и установки.

И код десериализатора для полученного Json:

public class FaqsDeserializador implements JsonDeserializer {

@Override
public ResponseFaqs deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

    JsonArray arrayJson = json.getAsJsonObject().get("name").getAsJsonArray();
    List<String> lista= new ArrayList<String>();

    for (int i=0;i<arrayJson.size();i++){
        Log.d("xxx",arrayJson.get(i).getAsJsonObject().get("value").getAsString());
        lista.add(arrayJson.get(i).getAsJsonObject().get("value").getAsString());
    }

    ResponseFaqs respuesta = new ResponseFaqs(lista);


    return respuesta;
}
}

Я выполняю все в методе onCreate Activity следующим образом:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity__preguntas__frecuentes);
    tvTitulo1= (TextView) findViewById(R.id.textView13);



    GsonBuilder builder=new GsonBuilder();
    builder.registerTypeAdapter(ResponseFaqs.class,new FaqsDeserializador());

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(Api.URL_BASE)
            .addConverterFactory(GsonConverterFactory.create(builder.create()))
            .build();


    ApiSocialFood Service = retrofit.create(ApiSocialFood.class);
    Call<ResponseFaqs> peticionFaqs=Service.faqs();
    peticionFaqs.enqueue(new Callback<ResponseFaqs>() {
        @Override
        public void onResponse(Call<ResponseFaqs> call, Response<ResponseFaqs> response) {

            if (response.code()== HttpURLConnection.HTTP_OK) {
                Toast.makeText(Activity_Preguntas_Frecuentes.this, "DENTRO DE LA IMAGEN", Toast.LENGTH_LONG).show();
                List<String> listafaqs = response.body().getListafaqs();
                tvTitulo1.setText(listafaqs.get(0));

            }else{
                Toast.makeText(Activity_Preguntas_Frecuentes.this, "NO HTTP_OK", Toast.LENGTH_SHORT).show();
            }
            }

        @Override
        public void onFailure(Call<ResponseFaqs> call, Throwable t) {
            Toast.makeText(Activity_Preguntas_Frecuentes.this,"FALLO CONEXION",Toast.LENGTH_SHORT);
        }
    });

}

Но когда я вхожу в действие, список которого я хочу загрузить, в любой момент программа входит в метод OnResponse. Почему не заходишь? Я получаю имя и URL-адрес другого json таким же образом, и он отлично работает, я не знаю, почему в этом случае он не работает.

Заранее спасибо :)

Что за ошибка? Идет ли код в onResponse или onFailure?

Soon Santos 23.10.2018 11:22

Ни один из двух, поэтому я не знаю, что не так, не выдает сообщений об ошибках

ElPendenciero 23.10.2018 11:44

Сложно сказать, что не так, вроде все нормально. Вы хотите поделиться со мной проектом, чтобы я мог более внимательно изучить его.

Soon Santos 23.10.2018 11:53

Извините, это не мой проект ...

ElPendenciero 23.10.2018 12:03
0
4
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение!

Как и в большинстве случаев в информатике, ошибка - это глупость, которую вы упускаете.

В этом случае возвращаемый Json начинается с arrayJson, а не с объекта Json, поэтому все, что вам нужно сделать, это добавить метод, который десериализует этот шаг.

Класс deserialieze будет таким:

открытый класс FaqsDeserializador реализует JsonDeserializer {

@Override
public ResponseFaqs deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {

    JsonArray arrayJson = json.getAsJsonArray();
    List<String> lista= new ArrayList<String>();

    for (int i=0;i<arrayJson.size();i++){
        Log.d("SocialFoodAPPAlvaro",arrayJson.get(i).getAsJsonObject().get("name").getAsJsonArray().get(0).getAsJsonObject().get("value").getAsString());
        lista.add(arrayJson.get(i).getAsJsonObject().get("name").getAsJsonArray().get(0).getAsJsonObject().get("value").getAsString());
    }

    ResponseFaqs respuesta = new ResponseFaqs(lista);


    return respuesta;
}

Другие вопросы по теме