자주 발생하는 문제와 해결법은 Gson을 사용하면서 직면할 수 있는 주요 오류를 다루고, 이를 효과적으로 해결하는 방법을 제시합니다. 직렬화 및 역직렬화 오류, Null 값 처리와 기본값 설정, JSON 데이터 검증은 Gson 사용 시 특히 중요한 이슈로, 이를 이해하면 코드 품질을 크게 향상시킬 수 있습니다.
직렬화 및 역직렬화 오류 해결
Gson은 간단한 JSON 구조를 처리하는 데는 문제가 없지만, 복잡한 구조나 데이터 타입 불일치로 인해 JsonSyntaxException이나 ClassCastException이 발생할 수 있습니다. 이를 방지하기 위해 주로 아래와 같은 방법을 사용합니다.
1. 잘못된 데이터 타입 처리
Gson은 JSON 데이터와 객체의 데이터 타입이 일치하지 않으면 예외를 발생시킵니다. 예를 들어, JSON 필드가 문자열이지만 해당 필드를 정수로 매핑할 경우 문제가 발생합니다. 이를 해결하기 위해 Custom Deserializer를 활용합니다.
import com.google.gson.*;
import java.lang.reflect.Type;
class CustomIntegerDeserializer implements JsonDeserializer<Integer> {
@Override
public Integer deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
try {
return json.getAsInt();
} catch (NumberFormatException e) {
return -1; // 기본값 설정
}
}
}
class User {
String name;
int age;
}
public class Main {
public static void main(String[] args) {
String json = "{\"name\": \"홍길동\", \"age\": \"스물다섯\"}";
Gson gson = new GsonBuilder()
.registerTypeAdapter(int.class, new CustomIntegerDeserializer())
.create();
User user = gson.fromJson(json, User.class);
System.out.println("이름: " + user.name);
System.out.println("나이: " + user.age);
}
}
2. 필드 누락 문제 해결
JSON에 객체의 필드가 없는 경우 기본값을 설정하려면 @SerializedName과 함께 transient 키워드를 활용하거나, 기본 생성자에서 값을 초기화합니다.
class User {
String name;
@SerializedName("age")
int age = 20; // 기본값 설정
transient String city = "서울"; // 직렬화 제외
}
Null 값 처리 및 기본값 설정
Null 값 처리는 데이터를 직렬화하거나 역직렬화할 때 중요한 문제입니다. 기본적으로 Gson은 Null 값을 무시하지만, 이를 처리하려면 아래 방법을 사용할 수 있습니다.
1. Null 값 포함하여 직렬화
GsonBuilder의 serializeNulls() 옵션을 사용하면 Null 값도 포함하여 JSON으로 직렬화할 수 있습니다.
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
class User {
String name;
Integer age;
String city;
public User(String name, Integer age, String city) {
this.name = name;
this.age = age;
this.city = city;
}
}
public class Main {
public static void main(String[] args) {
User user = new User("이영희", null, "부산");
Gson gson = new GsonBuilder().serializeNulls().create();
String json = gson.toJson(user);
System.out.println(json); // {"name":"이영희","age":null,"city":"부산"}
}
}
2. Null 값 기본값 설정
역직렬화 시 Null 값을 기본값으로 대체하려면 @JsonAdapter를 사용하여 커스텀 처리기를 정의합니다.
import com.google.gson.*;
class User {
String name;
int age;
String city;
public User(String name, int age, String city) {
this.name = name;
this.age = age;
this.city = city;
}
}
class UserDeserializer implements JsonDeserializer<User> {
@Override
public User deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) {
JsonObject obj = json.getAsJsonObject();
String name = obj.has("name") ? obj.get("name").getAsString() : "이름없음";
int age = obj.has("age") ? obj.get("age").getAsInt() : 0;
String city = obj.has("city") ? obj.get("city").getAsString() : "서울";
return new User(name, age, city);
}
}
public class Main {
public static void main(String[] args) {
String json = "{\"name\": \"김철수\"}";
Gson gson = new GsonBuilder()
.registerTypeAdapter(User.class, new UserDeserializer())
.create();
User user = gson.fromJson(json, User.class);
System.out.println(user.name + " - " + user.age + " - " + user.city);
}
}
예외 상황에서의 JSON 데이터 검증
Gson을 사용해 JSON 데이터를 처리할 때 예외를 방지하려면 데이터 유효성을 검증해야 합니다.
1. JSON 데이터의 필수 필드 확인
JsonObject를 통해 데이터를 수동으로 확인합니다.
public static void validateJson(String json) {
JsonObject obj = JsonParser.parseString(json).getAsJsonObject();
if (!obj.has("name") || !obj.has("age")) {
throw new IllegalArgumentException("필수 필드가 누락되었습니다.");
}
}
public static void main(String[] args) {
String json = "{\"name\": \"최영희\"}";
try {
validateJson(json);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
2. 스키마 기반 검증
외부 라이브러리를 사용하여 JSON 스키마를 기반으로 데이터를 검증할 수도 있습니다. 예를 들어, JSON Schema Validator를 활용합니다.
참고사이트
- Gson 공식 문서: https://github.com/google/gson
- JSON Schema Validator: https://github.com/java-json-tools/json-schema-validator
'JAVA' 카테고리의 다른 글
[JAVA] Gson의 확장과 커스터마이징 (1) | 2024.12.15 |
---|---|
[JAVA] Gson과 최신 Java 기능 연계 (0) | 2024.12.15 |
[JAVA] 실전 프로젝트에서의 Gson 활용 (0) | 2024.12.15 |
[JAVA] Gson과 REST API (0) | 2024.12.15 |
[JAVA] Gson의 제한사항과 문제 해결 (0) | 2024.12.14 |
[JAVA] Gson을 활용한 성능 최적화 (0) | 2024.12.14 |
[JAVA] Gson과 JSON 파싱 (0) | 2024.12.14 |
[JAVA] Gson과 날짜/시간 처리 (0) | 2024.12.14 |