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
フィールド レベルではなく、メソッド レベルのアノテーション。