아래 코드는 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;
}
'개발이야기 > Java' 카테고리의 다른 글
[Java] Calendar, Date 클래스 활용해서 날짜 계산하고 더하기 (0) | 2024.02.02 |
---|---|
[Java] JSONObject 클래스 사용해서 Map을 JSON으로 변환하기 (0) | 2024.01.29 |
[Java] ObjectUtils 클래스 메서드 사용법, 예제 (isEmpty, nullSafeEquals, isArray) (0) | 2024.01.18 |
[Java] 이미지 리사이징 후 저장하기 (Image Resize) (0) | 2024.01.04 |
[Java] File 내용 읽고 파일 정보 출력하기 (File 클래스 사용법, 예제) (0) | 2023.12.14 |
댓글