JSON development guidelines

At GitLab we handle a lot of JSON data. To best ensure we remain performant when handling large JSON encodes or decodes, we use our own JSON class instead of the default methods.

Gitlab::Json

This class should be used in place of any calls to the default JSON class, .to_json calls, and the like. It implements the majority of the public methods provided by JSON, such as .parse, .generate, .dump, etc, and should be entirely identical in its response.

The difference being that by sending all JSON handling through Gitlab::Json we can change the gem being used in the background. We use oj instead of the json gem, which uses C extensions and is therefore notably faster.

This class came into existence because, due to the age of the GitLab application, it was proving impossible to just replace the json gem with oj by default because:

  • The number of tests with exact expectations of the responses.
  • The subtle variances between different JSON processors, particularly around formatting.

The Gitlab::Json class takes this into account and can vary the adapter based on the use case, and account for outdated formatting expectations.

Gitlab::Json::PrecompiledJson

This class is used by our hooks into the Grape framework to ensure that already-generated JSON is not then run through JSON generation a second time when returning the response.

Gitlab::Json::LimitedEncoder

This class can be used to generate JSON but fail with an error if the resulting JSON would be too large. The default limit for the .encode method is 25 MB, but this can be customized when using the method.