【Java】GsonのFieldNamingPolicy列挙型でフィールド名の命名規則を制御する方法
Gsonライブラリでは、JSONシリアライズ時のフィールド名の命名規則がFieldNamingPolicyという列挙型(enum)として提供されています。GsonBuilderクラスのsetFieldNamingPolicy()メソッドを使うことで、この命名ポリシーを簡単に設定できます。
APIによってはスネークケースやケバブケースなど、特定の命名スタイルが求められることがあります。FieldNamingPolicyを活用すれば、Javaクラス側のコードを変更することなく、出力されるJSONのキー名だけを柔軟に変換できます。
FieldNamingPolicyの列挙定数一覧
- IDENTITY − この命名ポリシーを使用した場合、フィールド名は一切変更されず、元の名前がそのまま使われます。
- LOWER_CASE_WITH_DASHES − Javaフィールド名をキャメルケース形式から、各単語がダッシュ(-)で区切られたすべて小文字のフィールド名に変換します(ケバブケース)。
- LOWER_CASE_WITH_UNDERSCORES − Javaフィールド名をキャメルケース形式から、各単語がアンダースコア(_)で区切られたすべて小文字のフィールド名に変換します(スネークケース)。
- UPPER_CAMEL_CASE − JSONへシリアライズする際、Javaフィールド名の最初の「文字」が必ず大文字になることを保証します(パスカルケース)。
- UPPER_CAMEL_CASE_WITH_SPACES − JSONへシリアライズする際、Javaフィールド名の最初の「文字」を大文字にするとともに、単語間をスペースで区切ります。
構文
public enum FieldNamingPolicy extends Enum<FieldNamingPolicy> implements FieldNamingStrategy
使用例
以下のコードでは、Employeeクラスのインスタンスを生成し、5種類の命名ポリシーそれぞれでJSONに変換した結果を出力しています。
import com.google.gson.FieldNamingPolicy;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
public class GsonFieldNamingPolicyTest {
public static void main(String[] args) {
Employee emp = new Employee();
emp.setEmpId(115);
emp.setFirstName("Raja");
emp.setLastName("Ramesh");
GsonBuilder gsonBuilder = new GsonBuilder();
Gson gson1 = gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_DASHES).create();
String result1 = gson1.toJson(emp);
System.out.println("LOWER_CASE_WITH_DASHES: " + result1);
Gson gson2 = gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create();
String result2 = gson2.toJson(emp);
System.out.println("LOWER_CASE_WITH_UNDERSCORES: " + result2);
Gson gson3 = gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create();
String result3 = gson3.toJson(emp);
System.out.println("UPPER_CAMEL_CASE: " + result3);
Gson gson4 = gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE_WITH_SPACES).create();
String result4 = gson4.toJson(emp);
System.out.println("UPPER_CAMEL_CASE_WITH_SPACES: " + result4);
Gson gson5 = gsonBuilder.setFieldNamingPolicy(FieldNamingPolicy.IDENTITY).create();
String result5 = gson5.toJson(emp);
System.out.println("IDENTITY: " + result5);
}
}
// Employeeクラス
class Employee {
private int empId;
private String firstName;
private String lastName;
public int getEmpId() {
return empId;
}
public void setEmpId(int empId) {
this.empId = empId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}実行結果
同じEmployeeオブジェクトでも、設定した命名ポリシーによってJSONのキー名がどのように変化するか確認できます。
LOWER_CASE_WITH_DASHES: {"emp-id":115,"first-name":"Raja","last-name":"Ramesh"}
LOWER_CASE_WITH_UNDERSCORES: {"emp_id":115,"first_name":"Raja","last_name":"Ramesh"}
UPPER_CAMEL_CASE: {"EmpId":115,"FirstName":"Raja","LastName":"Ramesh"}
UPPER_CAMEL_CASE_WITH_SPACES: {"Emp Id":115,"First Name":"Raja","Last Name":"Ramesh"}
IDENTITY: {"empId":115,"firstName":"Raja","lastName":"Ramesh"}まとめ
FieldNamingPolicyを使いこなすことで、Javaの標準的なキャメルケースのフィールド名を持つクラスを、外部APIが要求する命名規則に合わせたJSONへ容易に変換できます。なお、より細かいカスタマイズが必要な場合は、FieldNamingStrategyインターフェースを実装して独自の命名戦略を定義することも可能です。用途に応じて適切なポリシーを選択しましょう。
-
Javaのタイプセーフな列挙型(enum)とは?特徴と使い方をわかりやすく解説
タイプセーフな列挙型(Type-Safe Enum)とは Javaの列挙型(enum)にはタイプセーフ(型安全)という重要な特徴があります。これは、enumが独自の名前空間を持つため、enum定数として宣言された値以外を代入できないことを意味します。仮に存在しない値を代入しようとすると、コンパイルエラーとして検出されます。このタイプセーフなenumはJava 1.5(JDK 5)で導入されました。 さらに、enumは参照型であり、その振る舞いはクラスやインターフェースに非常に近いものです。そのため、プログラマーはenum宣言の中にメソッドや変数を自由に定義することができます。 例1:基本的な
-
Javaのenum(列挙型)は拡張・継承できるのか?理由と代替手段を解説
結論:Javaでenumを拡張することはできないいいえ、Javaではenum(列挙型)を拡張(継承)することはできません。Javaのenumは、コンパイル時に暗黙的にjava.lang.Enumクラスを継承します。Javaは単一継承を採用している言語であるため、すでにEnumクラスを継承しているenumが、さらに別のクラスを継承することは構文的に不可能なのです。java.lang.Enumクラスの宣言実際に、JDKにおけるEnumクラスの宣言は以下のようになっています。public abstract class Enum<E extends Enum<E>>