Jacksonを使ったJavaとJSONの相互変換(アノテーション)
前回の記事
はじめに
今回はアノテーションを用いた相互変換について書いていこうと思います。Jacksonはアノテーションを用いてシリアライズ/デイシリアライズする際の挙動をコントロールする事ができます。アノテーションはいくつかのカテゴリに分類されます。詳しくは以下の公式Wikiを参照してみてください。
Jacksonのアノテーションは次の3つに分類されます。
- Property Naming (JsonProperty)
- Property Inclusion (JsonAutoDetect, JsonIgnore, JsonIgnoreProperty, Include)
- Deserialization and Serialization details (JsonUnwrapped, JsonView)
今回はPropertyNamingとPropertyInclusionの、JsonProperty、JsonAutoDetect、JsonIgnore、JsonViewについて書きたいと思います。
記事内のサンプルコードはこちらのGitHubに上がっています。
Property Naming
@JsonProperty
JsonPropertyアノテーションはJavaインスタンスのシリアライズ時のプロパティ名を指定するのに使います。付与できるのはフィールド、メソッド、パラメータになります。
例えば、次のようなJavaクラスがあり、
JSONに変換するとこのようになります。
Javaクラスではid,isbnというプロパティ名でしたが、JSONに変換されるとBOOK-ID,BOOK-ISBNになっている事がわかります。また、このJSONをデシリアライズすることもできます。デシリアライズするとBOOK-IDの値はidへ、BOOK-ISBNの値はisbnにセットされます。
また、JsonPropertyを付与したフィールドにはsetter,getterを作る必要がありません。setter,getterを作るのが面倒な時にはJsonPropertyを付与するだけでその手間を省く事ができます。JsonPropertyアノテーションに引数を与えなかった場合、相互変換時のプロパティ名はアノテーションを付与していない時と同じになります。
Property Inclusion
@JsonAutoDetect
JsonAutoDetectアノテーションはJavaインスタンスのシリアライズ時にどのプロパティを含めるかを設定するのに使います。クラスのみに付与できます。
指定の方法はそのプロパティの可視性になります。
- ANY ... 全ての可視性
- NON_PRIVATE ... プライベート以外のプロパティ
- PROTECTED_AND_PUBLIC ... プロテクテッドまたはパブリックのプロパティ
- PUBLIC_ONLY ... パブリックなプロパティ
- NONE ... そのプロパティを含めない
- DEFAULT ... デフォルトの設定を利用(親クラスに設定されているものを継承)
指定できるプロパティは以下になります。
- getter
- is-getter (booleanを返すgetter)
- setter
- creator (例えば引数なしコンストラクタ)
- field
例えばパブリックフィールドのみJSONへ変換したい場合、次のようにアノテーションを設定し、
次のように出力されます。
ただし、プライベートフィールドのisbnにgetterがある場合、JSONに変換されてしまうので、この場合にはgetterを無視するようにNONEを設定します。
@JsonIgnore
JsonAutoDetectはJsonプロパティに含めるJavaインスタンスのプロパティを指定するものでしたが、JsonIgnoreはその逆でJsonに含めたくないプロパティを指定します。
次のisbnプロパティをJSONにデシリアライズしたい場合、
次のように出力されます。
JsonIgnoreはJSONからJavaに変換する時にもプロパティを無視します。なので、上記のisbnはデシリアライズした時にnull値になります。
@JsonView
JsonViewは用途に応じてJavaプロパティをカテゴリ化し、個別のJSONにしたい場合に使います。
例えば、以下の例ではtitleとdescriptionはNormalというカテゴリに、authorとpublisherはManagementというカテゴリに分類されます。JsonViewが付与されていないプロパティはどのカテゴリにも含まれず、常にシリアライズ化されます。
NormalのみJSONにしたい場合、次のようにしてシリアライズします。
出力されるJSONは次の通りになります。
おわりに
Jsonアノテーションを使うことで、Javaインスタンスを柔軟にJSONへシリアライズ、デシリアライズすることができるとわかりました。他のJsonアノテーションについてもまた別に機会に整理できたらと思います。