LoginSignup
10
0

More than 1 year has passed since last update.

Jacksonデシリアライズをいい感じにしたい話

Last updated at Posted at 2022-12-17

この記事は ウェブクルー Advent Calendar 2022 18日目の記事です。
昨日は @yuko-tsutsui さんの「XXXXXXXXXXX」でした。

はじめに

弊社では、通常Scala + PlayFrameworkで開発をしているのですが、最近300年ぶりにJava + SpringBootでのAPI開発でJacksonに振り回された(いる)ので題材にしました。

Jacksonってなんだ

Javaで使用するJson parseライブラリ。JavaのオブジェクトからJsonへの変換、またその逆をよしなにやってくれる便利くんです。

Scalaに関しては先週のScala + Play Frameworkでリクエストを値オブジェクトにするで記事が書かれているので読んでください。

今回のお供JsonCreator

通常Jacksonはデシリアライズ時に、デフォルトコンストラクタを使用してインスタンスを生成します。JsonCreatorアノテーションをコンストラクタに付与することで、そちらを使用してデシリアライズをしてくれるようになります。

例えば、デフォルトコンストラクタを使用したくない、デシリアライズ時に何かしらの処理を実行したいなどがある場合には、これを使用することで実現することが可能になります。

というわけで

デシリアライズ時に必須チェックがしたい

変換時にオブジェクトに対応するフィールドが存在しない場合など、nullを避けるためにエラーにしたいことがありました。

@Data
public class FullName {
	private String familyName;
	private String firstName;
}

こんな感じのオブジェクトに

{ "family_name": "田中" }

なJsonをデシリアライズしたい場合、通常は

FullName("田中", null)

なオブジェクトが生成されます。first_name ないのに生成されては困る!賢いことは罪!
ということなので、JsonPropertyアノテーションを使用して必須項目を指定してあげます。

@Data
public class FullName {
	private String familyName;
	private String firstName;

  @JsonCreator
  public FullName(
		@JsonProperty(value = "family_name", required = true) String familyName,
		@JsonProperty(value = "first_name", required = true) String firstName
	){
		this.familyName = familyName;
		this.fistName = firstName;
	}
}

こうすることで、Json側にフィールドが存在しない場合、エラーを投げてもらえるようになります。

ありがとうJsonCreator

開発中いろいろと文献を探しましたが、シリアライズに関しては結構拾えるのですが、デシリアライズはあまり見つけることができませんでした。
結論、JsonCreatorアノテーションを使用すれば、何だかんだほぼ全て多分解決するので、ここをスタートラインにすれば解決できるはずです。
セットでJsonPropertyアノテーションを使用することも忘れずに。

他にもMODE設定でも変えられるので興味がある人はぜひ。

終わり

明日は @kalzit さんです。よろしくお願いします!

ウェブクルーでは一緒に働いていただける方を随時募集しております。

お気軽にエントリーください。

https://www.webcrew.co.jp/recruit/

10
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
0