PerlerのRuby日記

Rubyとか

Oj.dumpでシンボルを吐く時は:mode => compatする

Ojを知ったきっかけ

Padrinoでスケルトンを作るとGemfileにojというgemが入っている。
Optimized JSONの略らしい。


標準ライブラリとなったjsonよりも早いらしい。


Ruby - JSONの替わりに使ったOJが速い - Qiita [キータ]


自分も、開発しているサービスで使われているJSONデータを使ってやってみたら、
確かにOjの方が早かった。

https://gist.github.com/rightgo09/6492700


Ojのdump mode

で、改めて触ってたら、デフォルトでOj.dumpでJSONを吐くと、
シンボルはすべて":hoge"のようになることが分かったのでメモ。


もしそれが意図しておらず、JavaScriptでコロンは不要なら、

:mode => :compat

が必要である。


Oj.dump({ :hoge => :fuga })
#=> {":hoge":":fuga"}

Oj.dump({ :hoge => :fuga }, :mode => :compat)
#=> {"hoge":"fuga"}

他のmodeは

  • :strict
    • JSONと同じ型だけをdumpできる
      • FalseClass, NilClass, TrueClass, Hash, Array, Numeric, String
    • これら以外のRubyの型が含まれているデータをdumpしようとするとTypeError Exceptionが投げられる
  • :null
    • :strict modeでExceptionが投げられるデータがnullになって、例外が投げられなくなる
  • :object
    • オブジェクトを渡すと、オブジェクトのインスタンス変数をdumpしてくれる
    • これがパフォーマンス的に最高のモードらしい
  • :compat
    • compatはcompatibilityの略
    • 渡されたObjectがto_hashかto_jsonを呼べればそれを使う。なければOjがよしなにしてくれる

また、default_optionsを最初に設定しておくこともできる。

Oj.default_options = {:mode => :compat}