1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

KotlinAdvent Calendar 2024

Day 12

Jackson 3へ向けた議論に是非ご参加下さい!

Posted at

この記事はKotlin Advent Calendar 2024 12日目の記事になりました (まだ年内だからセーフ!)
Kotlinのアドカレでやるべき話か感も有りますが、他に空いていて適当そうなカレンダーが無かったのと、一応Kotlin文脈でも利益の有る話なのでご容赦下さい。


jackson-module-kotlinのメンテナをやっているwrongwrongと申します。
この記事ではJackson 3に向けたデフォルト挙動変更に関する議論について紹介します。

Jackson 3について

Jackson 3は、Jacksonのメジャーアップデートバージョンです。
開発は2017年後半から進められていましたが、この度本格的な移行へ向けた議論のためのDiscussionがメンテナのTatu Saloranta氏から投稿されました。

個人的に特に重要と感じているのは、メジャーバージョンアップ = デフォルト挙動の変更が可能という点です。

Jacksonは非常に歴史の長いライブラリであるため、不合理な挙動がデフォルトとなっている場合も有ります。
メジャーバージョンアップではそれを変更出来るため、ユーザーの皆様からの意見を取り込むことで、Jacksonをより使いやすくする大きな機会です。

ご意見の有る方は、是非上記のDiscussionへご参加下さい。

また、現時点での変更点全体は以下のWikiにまとめられています。

jackson-module-kotlinでの議論について

私がメンテナを務めるjackson-module-kotlinでも、リクエストを受け付けるためのイシューを作りました。
運用を定められていない部分も有りますが、ご意見など有りましたら一旦はこちらへ投稿頂ければ幸いです。

FAIL_ON_NULL_FOR_PRIMITIVESについて

次に、個人的に最も変更したいと考えているデフォルト挙動として、FAIL_ON_NULL_FOR_PRIMITIVESを紹介します。

Jackson 2のデフォルト挙動では、Java上でプリミティブ扱いされる型に対して、nullish値を入力してもエラーになりません。
サンプルコードに示す通り、特にKotlinから利用する場合、これは強く直感に反する挙動となります。

import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue

// DTO上はa・b共に非null定義
data class Dst(val a: Int, val b: Long)

val mapper = jacksonObjectMapper()

// 入力はaがundefined, bがnull -> Dstの定義より、直感的には失敗するはず
val src = """{"b":null}"""

// 一方、デフォルトだとデシリアライズできてしまう!
// Dst(a=0, b=0) が出力される
println(mapper.readValue<Dst>(src))

これを抑制できるのが、FAIL_ON_NULL_FOR_PRIMITIVESオプションです。
有効化することで、プリミティブ型に対するnullish値の入力をエラーとできます。

+ import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import com.fasterxml.jackson.module.kotlin.readValue

data class Dst(val a: Int, val b: Long)

+ val mapper = jacksonObjectMapper().enable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES)
- val mapper = jacksonObjectMapper()

val src = """{"b":null}"""

// FAIL_ON_NULL_FOR_PRIMITIVESを有効化すればMismatchedInputExceptionになる!
println(mapper.readValue<Dst>(src))

個人的には、なるべくデフォルトが直感的な挙動になっているべきということで、Jackson 3ではデフォルト有効にしたいと考えています。
賛同頂ける方は是非以下のDiscussionへ投票お願いします!

前述の通り、この他の意見も募集しておりますので、Jackson 3へ向けた議論に是非ご参加下さい!

1
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
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?