👀

RubyにおけるJSONシリアライザについて【2021年版】

2021/06/11に公開

はじめに

この記事は https://dev.to/okuramasafumi/what-you-should-know-about-json-serialization-solution-in-ruby-4imd の日本語訳です。が、著者が同じ(@okuramasafumi)であるため、許諾の問題などはありません。

tl;dr

AlbaはRubyで記述された高速かつ宣言的なJSONシリアライザであり、型付けやエラーハンドリング、ActiveModelSerializersライクなAPIをサポートしています。

Albaとは

Albaというのは私が開発しているJSONシリアライズのためのライブラリ(gem)です。

なぜ新しいJSONシリアライザが必要なのか

それは「ときめく」か

Rubyアプリケーションの開発者として、私はRubyのJSONシリアライザの比較をすることがありましたがいずれも満足なものではありませんでした。それらは「ときめかなかった」のです。

RubyエコシステムにおけるJSONシリアライザの比較

この表は完全に主観的であり、完全なものではありません。特に注意すべきはJSON:API関連のものが含まれていない点です。

誤りや追加すべきものがある場合は、私のTwitterアカウントまでご連絡ください。

名前 利点 欠点
ActiveModelSerializers 安定しており、記事やドキュメントが豊富 遅い・メンテされていない・複雑
jbuilder Rails公式でありよくメンテされている DSLが覚えづらい・パーシャルを多用すると遅くなる
blueprinter シンプル・高速・機能が豊富 "views"のような独特の語彙を用いる
representable JSON, XML、YAMLをサポートし、機能が豊富 遅い・複雑
jb 非常にシンプルで高速 複雑なJSONの構築に向いていない

私としては、blueprinterの速度やシンプルさ、representableの提供する機能に惹かれましたが、どちらも最高のものとは考えませんでした。

自分でも作れる!

プログラマとして考えた結果、私は自分でも既存のものより良いものを作って自分自身を満足させることはできると結論付けました。

私は自分のライブラリを可能な限り単純にしたかったので、”Alba"と名付けました。READMEに理由が書かれています

Albaの主要な目標はblueprinter並みにシンプルかつ高速であり、representable並みに機能が豊富であることです。

個人的な目標

私は自分の書いたコードが最高の努力でかつそれによってのみ達成されるようなものであったほしいと思っています。以下の項目はAlbaが私をプログラマとして満足させられるような目標です。

  • 最も小さい:自分自身の書いたものであっても長いコードは読みたくありません。コード行数を500行以下に保ちます
  • 最高のテストカバレッジ:コードカバレッジが完璧な指標ではないのはわかっていますが、テストがないと自信を持ってコードを書くことはできません。カバレッジを99%に保ちます
  • 最高のコード品質:CodeClimateのようなSaaSを使うことでコードに品質が低くなったときに気付くことができます。「コードの匂い」を完全にゼロにします

また、AlbaがRails以外の環境、例えばHanamiやSinatra、あるいは単独での使用のような状況でもうまく動作するように、Albaが他のgemに依存しないようにしています。いくつかの機能はActiveSupportに依存していますが、Albaは単に利用するだけならActiveSupportに依存しなくて済むように注意深く設計されています。

結果

ここまでAlbaを開発してきましたが、その結果は印象的です。

ベンチマークによれば、Albaは速度とメモリ消費量の両方でJSONシリアライザの中で最高でした。

Albaはエラーハンドリングのような独自機能に加えて、representableのみがサポートしている型付け機能やActiveModelSerializersのみがサポートする循環参照機能もサポートしています。

Albaはこれらの機能と速度をわずか500行以下のコードで実現しています。コードは99%以上のカバレッジでテストされています。

素晴らしい結果ですが、まだまだやることはたくさん残っています。

Albaの今後

AlbaはRubyエコシステムにおけるJSONシリアライザのデファクトスタンダードになることを狙っています。代替と比べて以下の優位性を提供します。

  • 速度:Albaは既存のJSONシリアライザの全てより高速です
  • 機能:Albaは通常必要な機能を網羅しつつ、型付けのような機能も提供します
  • シンプル:Albaは引き続き他のgemに依存しないため、Rails以外の環境での使用が容易です

Discussion