JSON開発者のためのガイドライン
GitLabでは多くのJSONデータを扱います。大きなJSONのエンコードやデコードを扱う際にパフォーマンスを保つために、デフォルトのメソッドではなく独自のJSONクラスを使用しています。
Gitlab::Json
このクラスは、デフォルトのJSON
クラスへの呼び出しや.to_json
呼び出しなどの代わりに使用する必要があります。このクラスは、.parse
、.generate
、.dump
など、JSON
によって提供される公開メソッドの大部分を実装しており、そのレスポンスは完全に同一でなければなりません。
違いは、すべてのJSON処理をGitlab::Json
、バックグラウンドで使用されるgemを変更できることです。json
gemの代わりにoj
。このgemはC拡張を使用しているため、著しく高速です。
このクラスが存在するようになったのは、GitLabアプリケーションが古くなったため、json
gemをデフォルトのoj
に置き換えることができなくなったからです:
- レスポンスを正確に予想するテストの数。
- 異なるJSONプロセッサ間の微妙な差異、特にフォーマットに関する差異。
Gitlab::Json
クラスはこの点を考慮し、ユースケースに応じてアダプタを変更したり、時代遅れのフォーマットを考慮したりすることができます。
Gitlab::Json::PrecompiledJson
このクラスは、Grapeフレームワークのフックで使用され、レスポンスを返すときに、すでに生成されたJSONが2回目のJSON生成で実行されないようにします。
Gitlab::Json::LimitedEncoder
このクラスは、JSONを生成するために使用できますが、結果のJSONが大きすぎる場合はエラーで失敗します。.encode
メソッドのデフォルトの制限は 25 MB ですが、メソッドを使用するときにカスタマイズできます。