RetroFit 仅贴图一半对象 Android studio
RetroFit maps only half the object Android studio
我在 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"。无论我尝试了什么,"response" 对象都没有被映射。你能帮帮我吗?
请在下面找到我的答案:
依赖关系
- com.squareup.okhttp3:okhttp: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 上设置。如果不是,请尝试这个答案。
终于找到答案了..!
我认为这是我的杰克逊版本中的一个错误,但我必须在 getter 和 setter 中设置 @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;
}
}
我在 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"。无论我尝试了什么,"response" 对象都没有被映射。你能帮帮我吗?
请在下面找到我的答案:
依赖关系
- com.squareup.okhttp3:okhttp: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 上设置。如果不是,请尝试这个答案。
终于找到答案了..! 我认为这是我的杰克逊版本中的一个错误,但我必须在 getter 和 setter 中设置 @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;
}
}