개발이야기/Java

[Java] Gson 사용해서 Json String DTO 변환하기

후린개발자 2024. 1. 29.
반응형

아래 코드는 Gson을 사용하여 JSON 문자열을 DTO Java 객체로 변환하는 예제 소스입니다. fromJsontoDto 메서드를 호출하여 DTO(데이터 전송 객체)로 변환해서 데이터를 효과적으로 전달하고 활용할 수 있게 됩니다.

 

 

1. fromJsontoDto 메서드

/**
* fromJsontoDto
* <pre>
* Gson을 사용하여 Json ==> DTO 변환
* </pre>
* @param <T>
* @param json
* @param type
* @return
* @throws IOException
*/
public static <T> T fromJsontoDto(String json, Type type) throws IOException {
	Gson gson = new GsonBuilder()
		.registerTypeAdapter(Map.class, new MapDeserializer()) 
		.excludeFieldsWithoutExposeAnnotation()
		.disableHtmlEscaping()
		.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
		.create();
	T rtn = gson.fromJson(json, type);
	return rtn;
}

 

1) <T>: 제네릭 타입 매개변수

-제네릭 타입을 사용하며, 반환되는 객체의 타입을 유연하게 처리할 수 있도록 합니다.

2) GsonBuilder 생성

-GsonBuilder를 사용하여 Gson 객체를 생성합니다. GsonBuilder는 Gson의 설정을 구성하는 데 사용됩니다.

3) registerTypeAdapter(Map.class, new MapDeserializer())

-Map 타입에 대한 커스텀 역직렬화 어댑터를 등록합니다. 이는 Gson이 Map을 어떻게 처리해야 하는지를 지정하는데 사용됩니다.

4) excludeFieldsWithoutExposeAnnotation()

-@Expose 어노테이션이 붙어있지 않은 필드는 변환에서 제외시킵니다. 어노테이션을 사용하여 직렬화 및 역직렬화에 참여할 필드를 선택적으로 지정할 수 있습니다.

5) disableHtmlEscaping()

-HTML 이스케이핑을 비활성화합니다. 문자열 내에서 특수 문자를 이스케이핑하지 않도록 하는 옵션입니다.

6) setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")

-날짜 포맷을 지정합니다. ISO 8601 형식의 날짜와 시간을 사용하도록 포맷을 설정했습니다.

7) create()

-설정이 완료된 GsonBuilder에서 Gson 객체를 생성합니다.

8) gson.fromJson(json, type)

-Gson 객체를 사용하여 주어진 JSON 문자열(json)을 지정된 타입(type)의 객체로 변환합니다. 이때, type 매개변수는 제네릭 타입 정보를 전달하는 역할을 합니다.

9) T rtn = ...

-변환된 객체를 변수 rtn에 할당합니다.

 

 

2. main 메서드

public static void main(String[] args) throws Exception {
        String json = "{ \"name\": \"John\", \"age\": 30, \"city\": \"New York\" }";
        TestDto tdto = fromJsontoDto(json, TestDto.class);
        
        // 변환된 DTO 객체 출력
        System.out.println("Name: " + tdto.getName());
        System.out.println("Age: " + tdto.getAge());
        System.out.println("City: " + tdto.getCity());
 }

 

1) JSON 문자열 생성

-테스트를 위해 JSON 형식의 문자열을 생성합니다. 문자열은 "name", "age", "city"라는 필드를 포함하는 TestDto 객체를 나타냅니다.

2) fromJsontoDto 메서드 호출

-fromJsontoDto 메서드를 호출하여 JSON 문자열을 TestDto 객체로 변환합니다. 변환에는 Gson 라이브러리가 사용됩니다.

3) 변환된 DTO 객체 출력

-변환된 TestDto 객체의 필드 값을 출력합니다. 이를 통해 JSON에서 DTO로의 변환이 성공적으로 이루어졌는지 확인할 수 있습니다.

 

 

3. 전체코드

1) 전체코드

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Map;

import com.cmm.util.MapDeserializer;
import com.common.saveSubscriptionInfo.service.TestDto;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class TEST {
    
    public static void main(String[] args) throws Exception {
        String json = "{ \"name\": \"John\", \"age\": 30, \"city\": \"New York\" }";
        TestDto tdto = fromJsontoDto(json, TestDto.class);
        
        // 변환된 DTO 객체 출력
        System.out.println("Name: " + tdto.getName());
        System.out.println("Age: " + tdto.getAge());
        System.out.println("City: " + tdto.getCity());
    } 
    
    /**
     * fromJsontoDto
     * <pre>
     * Gson을 사용하여 Json ==> DTO 변환
     * </pre>
     * @param <T>
     * @param json
     * @param type
     * @return
     * @throws IOException
     */
    public static <T> T fromJsontoDto(String json, Type type) throws IOException {
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(Map.class, new MapDeserializer()) 
                .excludeFieldsWithoutExposeAnnotation()
                .disableHtmlEscaping()
                .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
                .create();
        T rtn = gson.fromJson(json, type);
        return rtn;
    }
}

 

2) TestDto

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

import lombok.Getter;
import lombok.Setter;

public class TestDto {
        @Getter @Setter @Expose @SerializedName(value = "name", alternate = "Name")
        private  String Name;
        
        @Getter @Setter @Expose @SerializedName(value = "age", alternate = "Age")
        private  int Age;
        
        @Getter @Setter @Expose @SerializedName(value = "city", alternate = "City")
        private  String City;

}

 


Console 결과

반응형

댓글

💲 추천 글