JavaでJacksonを使用してJSONフィールド名を変更する

Jackson は、Java および Spring Boot ベースのプロジェクトで一般的に JSON およびシリアライゼーション/デシリアライゼーションを処理するための非常に一般的なライブラリです。

Jackson はプロパティ名をそのまま JSON にマッピングして処理します。 propertyName POJO には、対応する propertyName JSONで。 JSON を POJO に変換する場合もこの規則に従い、名前が一致しないと変換できません。

ただし、他のサービスの命名規則を標準化するなど、シリアル化された JSON プロパティに異なる名前を付けたい場合が多数あります (次のようなケースを使用します)。 snake_caseの代わりに、 CamelCase) または競合するプロパティ名 (a Customer 持つことができます firstName、ちょうど Agent – レポートには、 firstName プロパティであり、シリアル化する必要があります)。

作成してみましょう Book いくつかの単純なフィールドを持つクラス:

public class Book {
    private String title;
    private String author;
    private int releaseYear;
    
    public Book() {}
    public Book(String title, String author, int releaseYear) {
        this.title = title;
        this.author = author;
        this.releaseYear = releaseYear;
    }
    
}

Jackson で JSON フィールド名を変更する

通常、インスタンスを変換するとき Book JSON に変換するには、オブジェクトの値を JSON 文字列として書き込みます。 ObjectMapper:

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);
        
String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);

この結果:

{"title":"Our Mathematical Universe","author":"Max Tegmark","releaseYear":2014}

  title, author & releaseYear への 1 対 1 のマッピングです。 title, author & releaseYear POJO のフィールド。 JSON プロパティの名前を変更し、シリアル化後にそれを保持するために、POJO を変更する必要はありません! 関連するフィールドに注釈を付けるだけで十分です @JsonPropertyを入力し、JSON 名を指定します。

public class Book {
    @JsonProperty("book_title")
    private String title;
    @JsonProperty("book_author")
    private String author;
    @JsonProperty("book_release_year")
    private int releaseYear;
    
    public Book(){}
    public Book(String title, String author, int releaseYear) {
        this.title = title;
        this.author = author;
        this.releaseYear = releaseYear;
    }
    
}

ここで、オブジェクトをインスタンス化して JSON に変換すると、次のようになります。

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);

String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);

コードの結果は次のとおりです。

{"book_title":"Our Mathematical Universe","book_author":"Max Tegmark","book_release_year":2014}

JSON から POJO への変換で JSON フィールド名を変更しますか?

名前の変更は一方的なものではないことに注意してください。 同じアノテーションは両方の方法で機能し、異なる名前の着信 JSON を有効なオブジェクトにブリッジできます。 たとえば、ある本を表す JSON book_title、にマップされません title のプロパティ Book それらは同じではないため、デフォルトでクラスです。

注釈を付けたので title as book_title – 変換はうまくいきます:

Book bookReconstructed = mapper.readValue(jsonBook, Book.class);
System.out.print(bookReconstructed);

この結果:

Book{title='Our Mathematical Universe', author='Max Tegmark', releaseYear=2014}

注: JSON からオブジェクトを構築するには、クラスにも空のコンストラクターが必要です。 Jackson は最初に空のオブジェクトをインスタンス化し、次に getter と setter を使用してフィールドにデータを入力します。

@JsonProperty でゲッターとセッターに注釈を付ける

シリアライゼーションとデシリアライゼーションで異なる名前をエンコードしますか? たとえば、シリアル化できます Book でJSONに bt 本のタイトルを示しますが、JSON を使用して book_title. のゲッターとセッターをカスタマイズできます。 Book とのクラス @JsonProperty 注釈:

@JsonProperty("bt")
public String getBt() {
    return title;
}

@JsonProperty("book_title")
public void setTitle(String title) {
    this.title = title;
}

このように、シリアル化すると、 getBt() メソッドは title として bt JSON のフィールド。 JSON から読み取る (逆シリアル化する) 場合は、 book_titleにマッピングされます title.

ベストプラクティス、業界で認められた標準、および含まれているチートシートを含む、Gitを学習するための実践的で実用的なガイドを確認してください。 グーグルGitコマンドを停止し、実際に 学ぶ それ!

注: 両方 bt & book_title にマッピングされます title フィールド、しかしこれは作りません bt & book_title 交換可能。 Jackson は、最初に変換せずにそれらの間で変換することはできません。 title.

これで、本をインスタンス化し、シリアライズし、別の文字列をデシリアライズして本にすることができます:

ObjectMapper mapper = new ObjectMapper();
Book book = new Book("Our Mathematical Universe", "Max Tegmark", 2014);


String jsonBook = mapper.writeValueAsString(book);
System.out.println(jsonBook);


String input = "{"author":"Max Tegmark","releaseYear":2017,"book_title":"Life 3.0"}";
Book bookReconstructed = mapper.readValue(input, Book.class);
System.out.print(bookReconstructed);

この結果:

{"author":"Max Tegmark","releaseYear":2014,"bt":"Our Mathematical Universe"}
Book{title='Life 3.0', author='Max Tegmark', releaseYear=2017}

まとめ

この短いチュートリアルでは、Jackson がオブジェクト フィールドを JSON にマップする方法と、シリアル化の前にフィールドの名前を変更する方法について説明しました。 また、シリアライゼーションとデシリアライゼーションに異なる JSON 名を使用するというアイデアも検討しました。 @JsonProperty フィールド レベルではなく、メソッド レベルのアノテーション。

タイムスタンプ:

より多くの スタックアバス