ojからjsonに移行する
ということで、ojを使っていたアプリでjsonに移行してみた まずは高速化されたjson 2.9.0以上にアップデートする
Oj.mimic_JSONとOj.optimize_railsを外す
Oj.mimic_jsonをやめたことでmodeが:objectになるため:compatを明示的に指定しておく
Oj.optimize_railsはRails内で使われるJSONエンコーダーを差し替えるオプション
code:diff
- Oj.mimic_JSON
- Oj.optimize_rails
+ Oj.default_options = { mode: :compat }
ActionController::Parametersを直接JSONエンコードしている箇所で非互換が出た
to_hでHashにしてからエンコードするようにした
そんな行儀の悪いことはしないようにしましょう
次にOjを直接使っている箇所をJSONに移行していく
Oj.loadを使っていたところはJSON.parseに変更した
JSONにもJSON.loadはあるが、外部入力値を扱うために適切なオプションがデフォルトで指定されているなどの違いがあり、JSON.parseを使うほうがベター
RuboCopにもcopがあるくらいなので、parseを使うようにした 挙動の違い
code:ruby
Oj.load(json, symbol_keys: true).to_h
# これを以下のように置き換えた
json ? JSON.parse(json, symbolize_names: true) : {}
このjsonにはnilが入ることがある
Oj.load(nil)はnilを返すので、nil.to_hで空ハッシュになる。このnilのときは空ハッシュになる挙動を利用していたコードだった
しかしJSON.parse(nil)は例外を投げるので、nilチェックして分岐し、false節で空ハッシュを返すことで挙動を揃えた
全部終わったら、Gemfileからojを消して完了
リリース前後で、エンドポイントのレスポンスタイムにほぼ違いはなかった
標準のjsonで十分速いというのはいいですね