RetroFit отображает только половину объекта Android студия - PullRequest
0 голосов
/ 28 мая 2020

У меня есть ответ ниже в json

    {
  "date": 1590656196885,
  "host": "qa1234",
  "api": "v8",
  "response": {
    "type": "PickUp",
    "payload": {
      "serialNumber": "245547105486858"
    }
  }
}

Это мои классы ответов

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.init.models.Response;

@JsonInclude(JsonInclude.Include.NON_NULL)
    @JsonIgnoreProperties(ignoreUnknown = true)
    public class TransactionsResponseDetails extends ErrorResponse {

        @JsonProperty("date")
        private String date;
        @JsonProperty("host")
        private String host;
        @JsonProperty("api")
        private String api;
        @JsonProperty("response")
        private Response response;

        public TransactionsResponseDetails() {}

        public String getDate() {
            return date;
        }

        public void setDate(String date) {
            this.date = date;
        }

        public String getHost() {
            return host;
        }

        public void setHost(String host) {
            this.host = host;
        }

        public String getApi() {
            return api;
        }

        public void setApi(String api) {
            this.api = api;
        }

        public Response getResponse() {
            return response;
        }

        public void setResponse(Response response) {
            this.response = response;
        }
    }

-

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;

     @JsonInclude(JsonInclude.Include.NON_NULL)
        @JsonIgnoreProperties(ignoreUnknown = true)
        public class Response {
            @JsonProperty("payload")
            private Payload payload;
            @JsonProperty("type")
            private String type;

            public Response() {}

            public Payload getPayload() {
                return payload;
            }

            public void setPayload(Payload payload) {
                this.payload = payload;
            }

            public String getType() {
                return type;
            }

            public void setType(String type) {
                this.type = type;
            }
        }

-

import com.fasterxml.jackson.annotation.JsonProperty;

    class Payload {
        @JsonProperty("serialNumber")
        private String serialNumber;

        public Payload() {}

        public String getSerialNumber() {
            return serialNumber;
        }
        public void setSerialNumber(String serialNumber) {
            this.serialNumber = serialNumber;
        }
    }

и это фактический вызов с RetroFit

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import com.init.TransactionsResponse;
import com.init.models.responses.TransactionsResponseDetails;
.
.
.
    Call<TransactionsResponseDetails> Rcall = requestInterface.transactionsDetails(transactionResponseModelForTransactionDetails.get(0));
        Rcall.enqueue(new Callback<TransactionsResponseDetails>() {
            @Override
            public void onResponse(Call<TransactionsResponseDetails> call, Response<TransactionsResponseDetails> response) {
                try {
                    TransactionsResponseDetails transactionsResponseDetails;
                    if (response.isSuccessful()) {
                        transactionsResponseDetails = response.body();
                    } else {
                        transactionsResponseDetails = ErrorResponse.parseError(response, TransactionsResponseDetails.class);
                        if (BuildConfig.DEV_STATUS) {
                            Log.d("TransactionsModelError:", transactionsResponseDetails.getErrorModel().getErrorMessage());
                        }
                    }
                } catch (Exception ex) {
                    if (BuildConfig.DEV_STATUS) {
                        ex.printStackTrace();
                    }
                }

Это мой клиент

@Headers({"Content-Type: application/json", "Accept: application/json", BuildConfig.API_BASE_KEY})
@POST("transactions/details")
Call<TransactionsResponseDetails> transactionsDetails(@Body TransactionResponseModelForTransactionDetails transactionResponseModelForTransactionDetails);

Это моя настройка маппера

OkHttpClient : private static Retrofit.Builder builder = new Retrofit.Builder() .baseUrl(API_BASE_URL) .addConverterFactory(JacksonConverterFactory.create(getMapper()));

    private static ObjectMapper getMapper(){
        ObjectMapper mapper =  jacksonObjectMapper();
        mapper.configure(DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true);
            return mapper;
        }

звонок работает. Я вижу ответ json в своих журналах. Проблема в том, что сопоставление работает только для «date», «host» и «api». Независимо от того, что я пробовал, объект «ответа» не отображается. Не могли бы вы мне помочь?

Ответы [ 2 ]

0 голосов
/ 03 июня 2020

Наконец-то я получил ответ ..! Я думаю, что это ошибка в моей версии Джексона, но мне нужно установить @JsonProperty («response») как в геттерах, так и в сеттерах, чтобы класс TransactionsResponseDetails.class стал:

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.init.models.Response;

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class TransactionsResponseDetails extends ErrorResponse {

    @JsonProperty("date")
    private String date;
    @JsonProperty("host")
    private String host;
    @JsonProperty("api")
    private String api;
    @JsonProperty("response")
    private Response response;

    public TransactionsResponseDetails() {}

    public String getDate() {
        return date;
    }

    public void setDate(String date) {
        this.date = date;
    }

    public String getHost() {
        return host;
    }

    public void setHost(String host) {
        this.host = host;
    }

    public String getApi() {
        return api;
    }

    public void setApi(String api) {
        this.api = api;
    }

    @JsonProperty("response")
    public Response getResponse() {
        return response;
    }

    @JsonProperty("response")
    public void setResponse(Response response) {
        this.response = response;
    }
}
0 голосов
/ 28 мая 2020

Пожалуйста, найдите мой ответ ниже:

Зависимости

  • com.squareup.okhttp3: ok http:4.6.0
  • com.squareup.retrofit2: converter-jackson : 2.9.0
  • com.squareup.retrofit2: retrofit: 2.8.1

Конфигурация модернизации Java Файл

OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(new LoggingInterceptor())
                .build();
        // My Local Test Web Server replace with actual host
        final String host = "http://localhost:8080/";

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(HttpUrl.parse(host))
                .client(client)
                .addConverterFactory(JacksonConverterFactory.create())
                .build();
        TransactionService transactionService = retrofit.create(TransactionService.class);
        transactionService.getTransactionDetailsResponse()
                .enqueue(new Callback<TransactionsResponseDetails>() {
                    @Override
                    public void onResponse(Call<TransactionsResponseDetails> call, retrofit2.Response<TransactionsResponseDetails> response) {
                        System.out.println(response.body().toString());
                    }

                    @Override
                    public void onFailure(Call<TransactionsResponseDetails> call, Throwable throwable) {
                        throwable.printStackTrace();
                    }
                });

Перехватчик регистрации

static class LoggingInterceptor implements Interceptor {
        private Logger logger = Logger.getLogger(LoggingInterceptor.class.getSimpleName());

        @Override
        public okhttp3.Response intercept(Interceptor.Chain chain) throws IOException {
            Request request = chain.request();

            long t1 = System.nanoTime();
            logger.info(String.format("Sending request %s on %s%n%s",
                    request.url(), chain.connection(), request.headers()));

            okhttp3.Response response = chain.proceed(request);

            long t2 = System.nanoTime();
            logger.info(String.format("Received response for %s in %.1fms%n%s",
                    response.request().url(), (t2 - t1) / 1e6d, response.headers()));
            return response;
        }
    }

Интерфейс API:

public interface TransactionService {
        // My Local path replace with actual path
        @GET("hello/data")
        Call<TransactionsResponseDetails> getTransactionDetailsResponse();
}

Я использовал ваши классы POJO, потому что они не публиковали их.

Я считаю, что ваш конвертер не настроен на OkHttpClient. Если нет, попробуйте этот ответ.

...