>Java >java지도 시간 >Retrofit과 Gson을 사용하여 중첩된 JSON 데이터를 효율적으로 추출하려면 어떻게 해야 합니까?

Retrofit과 Gson을 사용하여 중첩된 JSON 데이터를 효율적으로 추출하려면 어떻게 해야 합니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-19 17:36:03313검색

How Can I Efficiently Extract Nested JSON Data Using Retrofit and Gson?

Retrofit을 사용하여 GSON으로 중첩된 JSON 객체 가져오기

문제 개요:

JSON 응답이 구조화된 API like:

{
    'status': 'OK',
    'reason': 'Everything was fine',
    'content': {
         < some data here >
}

원하는 POJO 데이터가 "content" 필드 내에 중첩되어 있는 경우 Retrofit은 기본적으로 전체 JSON 응답을 "status" 및 "reason" 필드가 있는 POJO로 역직렬화하지만 실제는 그렇지 않습니다. 관심 있는 데이터.

맞춤 설정 역직렬화:

중첩된 콘텐츠 필드를 자동으로 추출하려면 Gson을 사용하여 사용자 지정 역직렬 변환기를 생성할 수 있습니다.

콘텐츠 POJO:

정의 중첩된 데이터를 나타내는 POJO 클래스 as:

class Content {
    public int foo;
    public String bar;
}

Deserializer:

JsonDeserializer 구현 JSON 응답에서 "content" 요소를 추출하고 이를 Content POJO로 역직렬화합니다.

class MyDeserializer implements JsonDeserializer<Content> {
    @Override
    public Content deserialize(...) {
        JsonElement content = je.getAsJsonObject().get("content");
        return new Gson().fromJson(content, Content.class);
    }
}

Gson 구성:

GsonBuilder를 사용하여 Gson 인스턴스를 생성합니다. 사용자 정의 등록 deserializer:

Gson gson = new GsonBuilder()
    .registerTypeAdapter(Content.class, new MyDeserializer())
    .create();

다양한 유형을 위한 향상된 역직렬 변환기:

"content" 필드가 있는 여러 유형의 메시지가 있는 경우 다음과 같이 역직렬 변환기를 일반화할 수 있습니다.

class MyDeserializer<T> implements JsonDeserializer<T> {
    @Override
    public T deserialize(...) {
        JsonElement content = je.getAsJsonObject().get("content");
        return new Gson().fromJson(content, type);
    }
}

각 콘텐츠에 대해 이 디시리얼라이저의 인스턴스를 등록하세요. 유형.

Retrofit 통합:

맞춤형 Gson 인스턴스를 Retrofit 빌더에 전달합니다.

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl(url)
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build();

이 설정을 사용하면 Retrofit이 이제 자동으로 "content" 필드를 추출하고 적절한 POJO로 구문 분석하므로 수동으로 필드를 추출할 필요가 없습니다.

위 내용은 Retrofit과 Gson을 사용하여 중첩된 JSON 데이터를 효율적으로 추출하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.