Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java Gson에서 JSON 필드 이름 명명 규칙 정의하기 – FieldNamingPolicy 완벽 가이드

Gson의 FieldNamingPolicy란?

FieldNamingPolicy는 JSON 필드 이름에 대한 표준 명명 규칙을 정의할 수 있는 열거형(enum)입니다. 이는 GsonBuilder와 함께 사용하여 Gson 인스턴스를 구성하며, Java 필드 이름을 원하는 JSON 필드 이름으로 자동 변환해 줍니다.

GsonBuildersetFieldNamingPolicy() 메서드를 호출하면 직렬화(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 결과
IDENTITYfirstNamefirstName
LOWER_CASE_WITH_UNDERSCORESfirstNamefirst_name
LOWER_CASE_WITH_DASHESfirstNamefirst-name
UPPER_CAMEL_CASEfirstNameFirstName
UPPER_CAMEL_CASE_WITH_SPACESfirstNameFirst 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() 설정보다 우선적으로 적용됩니다.