Gson 및 Retrofit 2를 사용하여 복잡한 API 응답 역 직렬화

사용자 2393462435

Retrofit 2 및 Gson을 사용하고 있으며 API에서 응답을 역 직렬화하는 데 문제가 있습니다. 내 시나리오는 다음과 같습니다.

나는라는 이름의 모델 객체가 Employee세 개의 필드가 있습니다 : id, name, age.

다음 Employee과 같은 단일 객체 를 반환하는 API가 있습니다 .

{
    "status": "success",
    "code": 200,
    "data": {
        "id": "123",
        "id_to_name": {
            "123" : "John Doe"
        },
        "id_to_age": {
            "123" : 30
        }
    }
}

그리고 다음 Employee과 같은 객체 목록 :

{
    "status": "success",
    "code": 200,
    "data": [
        {
            "id": "123",
            "id_to_name": {
                "123" : "John Doe"
            },
            "id_to_age": {
                "123" : 30
            }
        },
        {
            "id": "456",
            "id_to_name": {
                "456" : "Jane Smith"
            },
            "id_to_age": {
                "456" : 35
            }
        },
    ]
}

여기서 고려해야 할 세 가지 주요 사항이 있습니다.

  1. API 응답은 data필드 내부의 중요한 부분과 함께 일반 래퍼로 반환됩니다 .
  2. API는 모델의 필드와 직접 일치하지 않는 형식으로 개체를 반환합니다 (예 :에서 가져온 값을 모델 id_to_ageage필드에 매핑해야 함 ).
  3. dataAPI 응답 필드는 단일 객체 또는 객체 목록 일 수 있습니다.

Gson이 세 가지 경우를 우아하게 처리하도록 deserialization을 어떻게 구현 합니까?

이상적으로 는 성능 패널티를 지불 TypeAdapter하거나 TypeAdapterFactory지불하는 대신 이 작업을 완전히 수행하는 것이 좋습니다 JsonDeserializer. 궁극적 으로이 인터페이스를 충족하는 Employeeor 인스턴스로 끝내고 싶습니다 List<Employee>.

public interface EmployeeService {

    @GET("/v1/employees/{employee_id}")
    Observable<Employee> getEmployee(@Path("employee_id") String employeeId);

    @GET("/v1/employees")
    Observable<List<Employee>> getEmployees();

}

내가 게시 한이 이전 질문은 이에 대한 첫 번째 시도에 대해 설명하지만 위에서 언급 한 몇 가지 문제를 고려하지 못했습니다. Retrofit 및 RxJava를 사용하여 JSON이 모델 객체에 직접 매핑되지 않을 때 어떻게 역 직렬화합니까?

엑창

편집 : 관련 업데이트 : 사용자 지정 변환기 공장을 만드는 작업은 작동합니다.의 무한 루프를 방지하는 핵심 ApiResponseConverterFactorynextResponseBodyConverter건너 뛸 공장을 지정할 수있는 Retrofit을 호출 하는 것입니다. 핵심은 이것이 Gson이 Converter.Factory아닌 Retrofit에 등록하는 것 TypeAdapterFactory입니다. 이것은 ResponseBody의 이중 역 직렬화를 방지하기 때문에 실제로 바람직합니다 (본문을 역 직렬화 한 다음 다른 응답으로 다시 패키징 할 필요가 없음).

구현 예제는 여기에서 요점을 참조하십시오.

원래 답변 :

ApiResponseAdapterFactory당신이 모든 서비스 인터페이스를 감싸 기꺼이하지 않는 방법이 작동하지 않습니다 ApiResponse<T>. 그러나 OkHttp 인터셉터라는 또 다른 옵션이 있습니다.

우리의 전략은 다음과 같습니다.

  • 특정 개조 구성을 위해, 당신은 응용 프로그램 인터셉터를 등록합니다. Response
  • Response#body()로 deserialize되고 우리가 원하는 콘텐츠가 있는 곳에 ApiResponsenew를 반환합니다 .ResponseResponseBody

그래서 ApiResponse다음과 같이 보입니다.

public class ApiResponse {
  String status;
  int code;
  JsonObject data;
}

ApiResponseInterceptor :

public class ApiResponseInterceptor implements Interceptor {
  public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
  public static final Gson GSON = new Gson();

  @Override
  public Response intercept(Chain chain) throws IOException {
    Request request = chain.request();
    Response response = chain.proceed(request);
    final ResponseBody body = response.body();
    ApiResponse apiResponse = GSON.fromJson(body.string(), ApiResponse.class);
    body.close();

    // TODO any logic regarding ApiResponse#status or #code you need to do 

    final Response.Builder newResponse = response.newBuilder()
        .body(ResponseBody.create(JSON, apiResponse.data.toString()));
    return newResponse.build();
  }
}

OkHttp 및 Retrofit 구성 :

OkHttpClient client = new OkHttpClient.Builder()
        .addInterceptor(new ApiResponseInterceptor())
        .build();
Retrofit retrofit = new Retrofit.Builder()
        .client(client)
        .build();

그리고 Employee하고 EmployeeResponse따라야 내가 앞의 질문에 쓴 어댑터 공장 구조를 . 이제 모든 ApiResponse필드는 인터셉터에서 사용되어야하며 모든 Retrofit 호출은 관심있는 JSON 콘텐츠 만 반환해야합니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

newtonsoft를 사용한 API 응답 역 직렬화

분류에서Dev

REST API의 HTTP 메서드에 대한 요청 및 응답에서 Json 직렬화 또는 역 직렬화를 적용하는 방법

분류에서Dev

Jackson 2-Android에서 Retrofit REST-API를 사용하여 문자열을 날짜로 직접 역 직렬화

분류에서Dev

Android : Retrofit 및 Jackson을 사용하여 동적 JSON 역 직렬화

분류에서Dev

NestJS가 복잡한 유형을 사용하여 @Query ()를 DTO로 역 직렬화

분류에서Dev

ReadAsAsync <T> ()를 사용하여 복잡한 Json 개체 역 직렬화

분류에서Dev

추가 변수를 사용한 gson 배열 역 직렬화

분류에서Dev

Retrofit2 및 Gson이 logcat에 응답하지 않습니다.

분류에서Dev

Immutablejs : 복잡한 JS 객체를 역 직렬화하는 방법

분류에서Dev

GSON을 사용하여 평면화 된 JSON 키를 적절한 개체로 역 직렬화

분류에서Dev

Firestore DB를 사용한 Flutter 데이터 직렬화 및 역 직렬화

분류에서Dev

C # Newtonsoft.json을 사용하여 단 하나의 속성 (루트를 찾을 수 없음)에 대한 Json 응답을 역 직렬화합니다.

분류에서Dev

NHibernate 응답을 통한 웹 API 사용자 정의 직렬화

분류에서Dev

사용자 지정 XmlSerialization을 사용하여 복잡한 개체 역 직렬화

분류에서Dev

복잡한 자바 객체를 부분적으로 역 직렬화하기

분류에서Dev

GSON 및 역 직렬화 오류

분류에서Dev

gson 및 개조로 json 역 직렬화

분류에서Dev

clrmq를 통한 직렬화 및 역 직렬화

분류에서Dev

@JsonProperty를 사용하여 JSON 응답을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

StreamReader 및 JsonTextReader를 사용한 역 직렬화가 작동하지 않음

분류에서Dev

MVVM 및 Retrofit을 사용하여 API를 호출 할 때 응답이 없습니까?

분류에서Dev

비트 크기 정의를 사용한 Java 사용자 정의 직렬화 및 역 직렬화

분류에서Dev

GSON 또는 Jackson을 사용하여 일반 인수를 사용하여 JSON을 클래스로 역 직렬화

분류에서Dev

Jackson을 사용하여 Lambda 직렬화 및 역 직렬화

분류에서Dev

spring-data-rest 및 컨트롤러는 직렬화 / 역 직렬화에 동일한 objectMaper를 사용합니다.

분류에서Dev

GSON을 사용할 때 직렬화 및 역 직렬화를 위해 REST-WS 소비자 및 공급자 쪽에서 동일한 POJO를 유지해야합니까?

분류에서Dev

Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

분류에서Dev

Json.NET을 사용하여 ArrayList의 ArrayList를 직렬화 및 역 직렬화하는 방법

분류에서Dev

GSON은 복잡한 객체 배열을 역 직렬화합니다.

Related 관련 기사

  1. 1

    newtonsoft를 사용한 API 응답 역 직렬화

  2. 2

    REST API의 HTTP 메서드에 대한 요청 및 응답에서 Json 직렬화 또는 역 직렬화를 적용하는 방법

  3. 3

    Jackson 2-Android에서 Retrofit REST-API를 사용하여 문자열을 날짜로 직접 역 직렬화

  4. 4

    Android : Retrofit 및 Jackson을 사용하여 동적 JSON 역 직렬화

  5. 5

    NestJS가 복잡한 유형을 사용하여 @Query ()를 DTO로 역 직렬화

  6. 6

    ReadAsAsync <T> ()를 사용하여 복잡한 Json 개체 역 직렬화

  7. 7

    추가 변수를 사용한 gson 배열 역 직렬화

  8. 8

    Retrofit2 및 Gson이 logcat에 응답하지 않습니다.

  9. 9

    Immutablejs : 복잡한 JS 객체를 역 직렬화하는 방법

  10. 10

    GSON을 사용하여 평면화 된 JSON 키를 적절한 개체로 역 직렬화

  11. 11

    Firestore DB를 사용한 Flutter 데이터 직렬화 및 역 직렬화

  12. 12

    C # Newtonsoft.json을 사용하여 단 하나의 속성 (루트를 찾을 수 없음)에 대한 Json 응답을 역 직렬화합니다.

  13. 13

    NHibernate 응답을 통한 웹 API 사용자 정의 직렬화

  14. 14

    사용자 지정 XmlSerialization을 사용하여 복잡한 개체 역 직렬화

  15. 15

    복잡한 자바 객체를 부분적으로 역 직렬화하기

  16. 16

    GSON 및 역 직렬화 오류

  17. 17

    gson 및 개조로 json 역 직렬화

  18. 18

    clrmq를 통한 직렬화 및 역 직렬화

  19. 19

    @JsonProperty를 사용하여 JSON 응답을 역 직렬화하는 방법은 무엇입니까?

  20. 20

    StreamReader 및 JsonTextReader를 사용한 역 직렬화가 작동하지 않음

  21. 21

    MVVM 및 Retrofit을 사용하여 API를 호출 할 때 응답이 없습니까?

  22. 22

    비트 크기 정의를 사용한 Java 사용자 정의 직렬화 및 역 직렬화

  23. 23

    GSON 또는 Jackson을 사용하여 일반 인수를 사용하여 JSON을 클래스로 역 직렬화

  24. 24

    Jackson을 사용하여 Lambda 직렬화 및 역 직렬화

  25. 25

    spring-data-rest 및 컨트롤러는 직렬화 / 역 직렬화에 동일한 objectMaper를 사용합니다.

  26. 26

    GSON을 사용할 때 직렬화 및 역 직렬화를 위해 REST-WS 소비자 및 공급자 쪽에서 동일한 POJO를 유지해야합니까?

  27. 27

    Jackson을 사용하여 JAVA 클래스를 대상으로하는 JSON 직렬화 및 역 직렬화

  28. 28

    Json.NET을 사용하여 ArrayList의 ArrayList를 직렬화 및 역 직렬화하는 방법

  29. 29

    GSON은 복잡한 객체 배열을 역 직렬화합니다.

뜨겁다태그

보관