Upgrade to Pro — share decks privately, control downloads, hide ads and more …

jackson-module-kotlinを読もう!

wrongwrong
April 15, 2022
1.2k

 jackson-module-kotlinを読もう!

Server-Side Kotlin Meetup vol.2

wrongwrong

April 15, 2022
Tweet

Transcript

  1. 自己紹介 宮田 木織 株式会社justInCaseTechnorogiesバックエンドエンジニア アウトプットしているアカウント Qiita: @wrongwrong GitHub: k163377 OSS活動

    去年から jackson-module-kotlin へしばしばコントリビュートしています 2021年下半期のコミット数世界一でした 最近は kotlin-reflect の value class 絡みのバグ修正にも携わりました 3
  2. Jackson /jackson-module-kotlin とは Jackson は、 Java 向けでは世界で最も使われている JSON ライブラリの一つ 外部モジュールを使えば

    CSV や XML といったフォーマットも処理可能 jackson-module-kotlin は、 Jackson を Kotlin で利用するためのモジュール 以下のような機能を提供している コンストラクタ呼び出しでのデシリアライズ Kotlin 固有の型に関するシリアライズ/デシリアライズ Jackson を Kotlin から扱いやすくする関数類 特に Kotlin で SpringBoot を使う場合かなり利用機会がある 4
  3. KotlinModule.kt KotlinFeature.kt KotlinModule.Builder への設定項目 設定可能な項目の例 値が null の場合にデフォルト値を利用する デシリアライズ時に Collection

    要素の nullability を厳密にチェックする KotlinModule.Builder 設定を登録した上で KotlinModule を生成するビルダー 設定可能な項目の例 KotlinFeature の有効/無効化 リフレクション処理のキャッシュ量の上限値 9
  4. KotlinNamesAnnotationIntrospector.kt Kotlin 上のis~ というプロパティのシリアライズ結果を自然にする処理 Jackson のデフォルト挙動では、 isFoo() という getter は

    foo プロパティになる これは Kotlin から見ると不自然な挙動 findRenameByField getter から作られたプロパティ名をフィールド名から補正するための関数 is から始まるプロパティ名だった場合にそれが消えないようにしている 12
  5. まとめ この発表では、ざっくり jackson-module-kotlin を読んでみたい方向けに幾つかのコ ードを解説しました jackson-module-kotlin のコードを読んでみるのは、 Jackson を使いこなす上で非 常に役に立つと思います

    紹介しきれなかったコードも多くあるので是非1度読んでみて下さい! 特に役立ちそう: Extensions.kt コントリビュートしてみたい方も是非! 15
  6. We are hiring! justInCaseTechnologiesでは保険APIサーバーを開発するバックエンドエンジニアを募集 しています 技術スタック: Kotlin / Spring Webflux

    / AWS 「助けられ、助ける喜びを、全ての人へ。」をテーマに、保険業務の効率化によってみ なさんによりよい保険を届けます 詳しくはホームページから! 採用全般 エンジニア求人一覧 16
  7. jackson-module-kotlin をビルドしてテストを走らせるまで 前提 Intellij IDEA や Java ・ Maven を動かすための環境は構築済みとする

    リポジトリは fork ・ clone 済みとする https://github.com/FasterXML/jackson-module-kotlin Maven のコマンドは mvn ~~ で記述する 18
  8. jackson-module-kotlin をビルドしてテストを走らせるまで テスト実行 mvn verify で全てのテストが実行できる Windows の場合改行コード問題で一部テストが失敗する 補足: IDEA

    から初回テストを実行する mvn replacer:replace を先に実行(← ここ重要!) 初回は必要なコードがローカルに生成されていないため mvn verify で実行した場合、これも自動で実行されている IDEA からテストを実行 e.g. テスト横の再生ボタンを押す 19
  9. jar を生成する mvn jar:jar で、 ${ プロジェクトルート}/target 配下に jackson-module- kotlin-${

    バージョン}.jar が出力される まだ公開されていない SNAPSHOT などは、ローカルで生成した jar を使って検証で きる 20
  10. すぐ直せそうな問題(1) Extensions.kt fun foo(...) = Unit.apply { ... } となっている関数の

    = Unit.apply は 消せる KotlinDeserializers.kt type.isInterface の判定は消せる その後に class の一致を判定しているので interface 比較は無意味 KotlinFeature.kt BitSet 関連の計算が非効率 23
  11. すぐ直せそうな問題(2) KotlinKeyDeserializers.kt unsigned integers 系の処理では super.deserializeKey するより目的の値に 直接パースした方が効率的 パースには StdKeyDeserializer

    の _parseInt のような関数を利用する KotlinModule.kt ClosedRange に対してだけ Mixin を登録する形にできる 登録されている ~Range は全て ClosedRange を継承しており、特別なプロパ ティも無い KotlinNamesAnnotationIntrospector.kt このクラスを KotlinAnnotationIntrospector にまとめてもテスト結果は変化し ないため、まとめられるかも (これは結構検証が難しいかもしれない) 24