この記事は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
へ向けた議論に是非ご参加下さい!