투케이2K

163. (TWOK/WORK) [개발 요청] Gson 사용해 API 호출 후 클래스 매핑 및 JSON 전송 시 특정 값 제거 요청 - Expose null JSON 생성 예외 처리 본문

투케이2K 업무정리

163. (TWOK/WORK) [개발 요청] Gson 사용해 API 호출 후 클래스 매핑 및 JSON 전송 시 특정 값 제거 요청 - Expose null JSON 생성 예외 처리

투케이2K 2025. 6. 1. 09:47

[제 목]

[개발 요청] Gson 사용해 API 호출 후 클래스 매핑 및 JSON 전송 시 특정 값 제거 요청 - Expose null JSON 생성 예외 처리

 

[내 용]

------------------------------------------------------------------------------
[개발 및 테스트 환경]
------------------------------------------------------------------------------

- 제목 : [개발 요청] Gson 사용해 API 호출 후 클래스 매핑 및 JSON 전송 시 특정 값 제거 요청 - Expose null JSON 생성 예외 처리


- 테스트 환경 : 삼성 갤럭시 스마트폰


- 사전 안드로이드 Gradle Gson 의존성 부여 코드 : 

  implementation 'com.google.code.gson:gson:2.8.6'

------------------------------------------------------------------------------





------------------------------------------------------------------------------
[개선 요청 사항]
------------------------------------------------------------------------------

1. 안드로이드에서 특정 API 호출 후 공통 Model 모델 클래스를 사용해 Response JSON 파싱 및 Request 요청을 수행하는데 

   Request 전송 시 특정 JSON 파라미터 값 미사용으로 제거 요청

------------------------------------------------------------------------------





------------------------------------------------------------------------------
[원인 파악 및 증상 재현]
------------------------------------------------------------------------------

1. 특정 API 호출 수행 및 Respones 응답 JSON 데이터 Model 클래스에 매핑 수행


2. Gson 사용해 Model 클래스 JSON 형태로 변환 후 API Body 부분에 전송 수행


3. Request Body 부분에 불필요한 파라미터 포함되어 전송 되는 것 확인

------------------------------------------------------------------------------





------------------------------------------------------------------------------
[조치 내용]
------------------------------------------------------------------------------

1. Gson Model 클래스에서 null 값이 변수 JSON 생성 시 예외 처리 되도록 Expose 처리 수행

  >> @SerializedName("key_note") @Expose public Note note;

  >> SerializedName : JSON 생성 시 지정 되는 Key 명칭


2. 변경 된 기능 로직 확인 : 

  >> 특정 API 호출 수행 및 Respones 응답 JSON 데이터 Model 클래스에 매핑 수행 (이때, 장치에서는 Model 클래스에서 정의 되어 있지 않은 값도 전송 함)

  >> Gson 사용해 매핑 된 Model 클래스 Json 데이터로 생성 수행 및 다른 API 호출 시 Body 에 데이터 추가 실시

    - 전송을 원하지 않는 데이터는 Model 클래스에서 변수 값 null 초기화 설정 (Expose 에서 예외 처리 되도록 null 지정)

  >> API 호출 Body 부분에 필요한 데이터만 전송 되는 것 확인


3. Gson 사용해 클래스 매핑 및 JSON 생성 참고 코드 : 

  // TODO [Json Key 값은 Model 클래스에 선언 된 SerializedName 사용]


  // TODO [Json To Model]
  String sampleJson = "{\n" +
          "  \"key_name\": \"TWOK\",\n" +
          "  \"key_age\": 29\n" +
          "}";

  M_Person m_person = new Gson().fromJson(sampleJson, M_Person.class);

  S_Log._W_("Json To Model", new String[]{
          "name :: " + String.valueOf(m_person.name),
          "age :: " + String.valueOf(m_person.age),
          "note :: " + String.valueOf(m_person.note),
          "items :: " + String.valueOf(m_person.items),
  });


  // TODO [Model To Json]
  String jsonString = new Gson().toJson(m_person);

  S_Log._W_("Model To Json", new String[]{
          "jsonString :: " + String.valueOf(jsonString)
  });


4. Model 클래스 샘플 소스 코드 : 

package com.example.javaproject.C_Annotation;

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

import java.util.ArrayList;

public class M_Person {



    /**
     * // --------------------------------------------------------------------------------------

     * TODO [클래스 설명]
     * // --------------------------------------------------------------------------------------
     * 1. GSON 모델 클래스
     * // --------------------------------------------------------------------------------------
     * 2. @SerializedName : JSON 객체 생성 시 표시될 key name
     * // --------------------------------------------------------------------------------------
     * 3. @Expose : 데이터가 null 일 경우 json 생성 시 제외 설정
     * // --------------------------------------------------------------------------------------
     * 4. build.gradle 설정 :
     *
     * implementation 'com.google.code.gson:gson:2.8.6'
     * // --------------------------------------------------------------------------------------
     * */





    // -----------------------------------------------------------------------------------------
    // TODO [전역 변수 선언]
    // -----------------------------------------------------------------------------------------
    private static final String ACTIVITY_NAME = "M_Person";





    // -----------------------------------------------------------------------------------------
    // TODO [클래스 생성자 초기화]
    // -----------------------------------------------------------------------------------------
    public M_Person(String name, int age, Note note, ArrayList<Item> items){
        this.name = name;
        this.age = age;
        this.note = note;
        this.items = items;
    }





    // -----------------------------------------------------------------------------------------
    // TODO [JSON KEY DATA]
    // -----------------------------------------------------------------------------------------

    // [JSON KEY]
    @SerializedName("key_name") public String name;

    // -------------------------------------------

    // [JSON KEY]
    @SerializedName("key_age") public int age;

    // -------------------------------------------

    // [JSON KEY] : Expose
    @SerializedName("key_note") @Expose public Note note;

    // -------------------------------------------

    // [JSON KEY] : Expose
    @SerializedName("key_item") @Expose public ArrayList<Item> items;

    // -------------------------------------------

    // [JSON OBJECT]
    public static class Note {

        public Note(String blog){
            this.blog = blog;
        }

        @SerializedName("key_blog") public String blog;
    }

    // -------------------------------------------

    // [JSON ARRAY]
    public static class Item {

        public Item(String lang, String tool){
            this.lang = lang;
            this.tool = tool;
        }

        @SerializedName("key_lang") public String lang;
        @SerializedName("key_tool") public String tool;
    }

    // -------------------------------------------


} // TODO [클래스 종료]


W///===========//: ======================================================================
I/: [LOG :: DESCRIPTION :: Json To Model]
I/: ----------------------------------------------------
I/: [LOG :: name :: TWOK]
I/: ----------------------------------------------------
I/: [LOG :: age :: 29]
I/: ----------------------------------------------------
I/: [LOG :: note :: null]
I/: ----------------------------------------------------
I/: [LOG :: items :: null]
W///===========//: ======================================================================


W///===========//: ======================================================================
I/: [LOG :: DESCRIPTION :: Model To Json]
I/: ----------------------------------------------------
I/: [LOG :: jsonString :: {"key_age":29,"key_name":"TWOK"}]
W///===========//: ======================================================================

------------------------------------------------------------------------------





------------------------------------------------------------------------------
[참고 사이트]
------------------------------------------------------------------------------

[[GSON] SerializedName 사용해 모델 클래스 JsonObject , JsonArray 생성]

https://blog.naver.com/kkh0977/223027622493?trackingCode=blog_bloghome_searchlist


[[GSON] SerializedName 사용해 모델 클래스 생성 및 response 데이터 자동 파싱 수행 실시]

https://blog.naver.com/kkh0977/223027624556?trackingCode=blog_bloghome_searchlist


[GSON 사용해 VO 클래스 객체 매핑 및 JSON 생성 , 파싱 수행 실시]

https://blog.naver.com/kkh0977/222676375642?trackingCode=blog_bloghome_searchlist


[[GSON] SerializedName , Expose 사용해 모델 클래스 null 널 데이터 제외 JsonObject 생성]

https://blog.naver.com/kkh0977/223026741585?trackingCode=blog_bloghome_searchlist

------------------------------------------------------------------------------
 
반응형
Comments