Java
 Computer >> コンピューター >  >> プログラミング >> Java

【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インターフェースを実装して独自の命名戦略を定義することも可能です。用途に応じて適切なポリシーを選択しましょう。

  1. Javaのタイプセーフな列挙型(enum)とは?特徴と使い方をわかりやすく解説

    タイプセーフな列挙型(Type-Safe Enum)とは Javaの列挙型(enum)にはタイプセーフ(型安全)という重要な特徴があります。これは、enumが独自の名前空間を持つため、enum定数として宣言された値以外を代入できないことを意味します。仮に存在しない値を代入しようとすると、コンパイルエラーとして検出されます。このタイプセーフなenumはJava 1.5(JDK 5)で導入されました。 さらに、enumは参照型であり、その振る舞いはクラスやインターフェースに非常に近いものです。そのため、プログラマーはenum宣言の中にメソッドや変数を自由に定義することができます。 例1:基本的な

  2. 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>>