Uzzu::Blog

Software Design, and my life.

kotlinx.serialization/JSON利用時にkotlinx-serialization pluginを使用しない

kotlinx.serializationは書いて字の通りserialize/deserializeライブラリで、Multiplatformサポートと、フォーマットとしてJSON、CBOR、Protobufをサポートしています。バージョンが0系ということでinterfaceに変更が入る可能性はあるけど、まあ使わなければなんとやら。

annotation processorを用いたSerializer/Deserializer生成機能は多くのJSON ライブラリに含まれており、kotlinx.serializationでもGradle Pluginとして提供されています。便利ですが如何せんでかい。小さなライブラリで僅か1, 2個程度のdata classのSerializer/Deserializer生成をやるのは規模に見合っておらず、 org.json や GSON にあるようなJsonObject/JsonArrayで済ませたいケースもあるでしょう。

0.9.1 以前の場合、 kotlinx-serialization-runtime-common には JSON builderJsonTreeParser#parseが含まれています。JsonArrayな文字列を JsonTreeParser#parse する事ができない制約があうものの、これらを使ってある程度JsonObject/JsonArrayと同等の事ができます。runtimeだけ使う場合はannotation processorも未使用なので、 kotlinx-serialization Gradle Pluginの追加は不要で、runtimeの依存関係だけ解決すれば良いです。

0.10.0-eap-1からは JsonTreeParser#parse は非推奨になっており、代わりに Json#parseJson を使用します。こちらではJsonArrayな文字列が取り扱えない問題も解決しています。尚、eapではKotlin version 1.3.20-eap-xxを使用しているので、 kotlin-stdlib の依存解決をお忘れなきよう。

最初この存在を知らずJSONパーサを書き始めてしまって、ふと我に返りソースを読み始めたらありました。そりゃそうだよね。BSON、Protobufも使わないときは使わないので、さらにminimumなruntimeにしたくなったら独立したライブラリを作るかもしれない。

余談ですが、Pure Kotlin を謳っているライブラリ群はMultiplatform時代ではいくら全部Kotlinで書かれていようがJava API使ったらもうpureとは言い難い(jvm moduleにすべき)ですね。大変な時代だ。

comments powered by Disqus