Gson의 FieldNamingPolicy란?
FieldNamingPolicy는 JSON 필드 이름에 대한 표준 명명 규칙을 정의할 수 있는 열거형(enum)입니다. 이는 GsonBuilder와 함께 사용하여 Gson 인스턴스를 구성하며, Java 필드 이름을 원하는 JSON 필드 이름으로 자동 변환해 줍니다.
GsonBuilder의 setFieldNamingPolicy() 메서드를 호출하면 직렬화(Serialization) 및 역직렬화(Deserialization) 과정에서 객체의 필드에 특정 명명 정책 전략을 적용할 수 있습니다.
Gson이 지원하는 필드 명명 정책
- FieldNamingPolicy.IDENTITY: 객체를 직렬화할 때 Java 모델의 필드 이름을 그대로 사용합니다.
- FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES: 카멜 케이스(camel-case) 형태의 Java 필드 이름을 각 단어가 밑줄(_)로 구분되는 소문자 필드 이름으로 변경합니다.
- FieldNamingPolicy.LOWER_CASE_WITH_DASHES: 카멜 케이스 형태의 Java 필드 이름을 각 단어가 대시(-)로 구분되는 소문자 필드 이름으로 변경합니다.
- FieldNamingPolicy.UPPER_CAMEL_CASE: 직렬화 시 Java 필드 이름의 첫 번째 "문자"를 대문자로 표기합니다.
- FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES: 직렬화 시 첫 번째 문자를 대문자로 표기하고, 단어 사이를 공백으로 구분합니다.
아래 표는 각 정책이 Java 필드 이름을 어떻게 변환하는지 보여줍니다.
| 명명 정책 | Java 필드 예시 | JSON 결과 |
|---|---|---|
| IDENTITY | firstName | firstName |
| LOWER_CASE_WITH_UNDERSCORES | firstName | first_name |
| LOWER_CASE_WITH_DASHES | firstName | first-name |
| UPPER_CAMEL_CASE | firstName | FirstName |
| UPPER_CAMEL_CASE_WITH_SPACES | firstName | First Name |
예제 코드
import com.google.gson.*;
import java.sql.Date;
import java.time.LocalDate;
public class FieldNamingPolicyTest {
public static void main(String[] args) {
Gson gson = new GsonBuilder().setPrettyPrinting().setDateFormat("yyyy-MM-dd")
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES).create();
Person p = new Person("Raja", "Ramesh", 30, Date.valueOf(LocalDate.of(1988, 1, 1)));
String jsonStr = gson.toJson(p);
System.out.println(jsonStr);
}
}
// Person 클래스
class Person {
private String fistName;
private String lastName;
private int _age;
private Date dateOfBirth;
public Person(String fistName, String lastName, int _age, Date dateOfBirth) {
super();
this.fistName = fistName;
this.lastName = lastName;
this._age = _age;
this.dateOfBirth = dateOfBirth;
}
}
실행 결과
{
"fist-name": "Raja",
"last-name": "Ramesh",
"_age": 30,
"date-of-birth": "1988-01-01"
}위 출력에서 볼 수 있듯이, 카멜 케이스로 작성된 fistName, lastName, dateOfBirth 필드는 대시(-)로 구분된 소문자 JSON 키로 변환되었습니다. 반면 _age처럼 이미 밑줄로 시작하거나 대문자가 포함되지 않은 필드는 명명 정책의 영향을 받지 않고 그대로 유지됩니다.
참고: 개별 필드에 다른 이름을 지정하려면?
전역 명명 정책 대신 특정 필드에만 사용자 지정 JSON 이름을 부여하고 싶다면, @SerializedName("custom_name") 어노테이션을 해당 필드에 선언하면 됩니다. 어노테이션이 적용된 필드는 setFieldNamingPolicy() 설정보다 우선적으로 적용됩니다.