看到几个项目的源码在操作json时都选择了Oj,今天有空看下对比ruby或者rails中提供的方式有什么优势。

github上介绍很自信,也很简单,就是快。(A fast JSON parser and Object marshaller as a Ruby gem.)

我们先把知道的几种方法列举一下,基本操作就是转化成json和解析json:

1. 使用Oj工具

h = { 'one' => 1, 'array' => [ true, false ] }
json = Oj.dump(h)  # hash解析成json
h2 = Oj.load(json) # json解析成hash
#示例:
a = Oj.dump({a: 1, b: 2})  #=> "{\"a\":1,\"b\":2}"
Oj.load(a)                 #=> {"a"=>1, "b"=>2}

2. rails提供的ActiveSupport::JSON, 同样使用上面的示例:

a = ActiveSupport::JSON.encode({a: 1, b: 2})  #=> "{\"a\":1,\"b\":2}"
ActiveSupport::JSON.decode(a)                 #=> {"a"=>1, "b"=>2}

3. ruby提供的JSON解析对象:

require "json"
a = JSON.generate({a: 1, b: 2})  #=> "{\"a\":1,\"b\":2}"
JSON.parse(a)                 #=> {"a"=>1, "b"=>2}

简单对比3种方式的benckmark的结果:

require 'benchmark'
require "json"
n = 5000
Benchmark.bmbm do |x|
  x.report { n.times { Oj.load("{\"a\":1,\"b\":2}") } }
  x.report { n.times { ActiveSupport::JSON.decode("{\"a\":1,\"b\":2}") } }
  x.report { n.times { JSON.parse("{\"a\":1,\"b\":2}") } }
end

结果显示Oj的解析速度是最快的,ActiveSupport::JSON的解析速度最慢,在开发环境的系统中相差近5倍(更好的硬件环境下可能差距会更大),所以建议选择使用Oj作为系统操作json的工具。

Rehearsal ----------------------------------------------------------------------
parse by Oj                          0.090000   0.000000   0.090000 (  0.115041)
parse by Rails ActiveSupport::JSON   0.210000   0.010000   0.220000 (  0.237688)
parse by Ruby JSON                   0.150000   0.010000   0.160000 (  0.151802)
------------------------------------------------------------- total: 0.470000sec

                                         user     system      total        real
parse by Oj                          0.070000   0.000000   0.070000 (  0.072395)
parse by Rails ActiveSupport::JSON   0.260000   0.010000   0.270000 (  0.346393)
parse by Ruby JSON                   0.170000   0.010000   0.180000 (  0.196502)