なにであってなにでないのか
semantically wrong な JSON を semantically right に書き換えるためのDSLを提供する gem です。syntactically wrong な JSON を syntactically right に書き換えるものではありません。
なぜこんなニッチなものを
twitter とかそういう「ちゃんとした」ところの API は腐った JSON を吐くみたいなことはあまりないのですが、社内 API とか昔自分が書いたクソな API とか昔自分が DB につっこんじゃった腐った JSON とか、そういうものは意外といろんなところにあるし、けっこうそういう話も周りで聞くので、じゃあ、って感じで作りました。
以前 json-fixman というものも作っていたのですが、DSLがちょっとやな感じだったのとコードが汚いのがアレだったので、全面的に rewrite して rename しました。json-fixman は github にしか上がってませんが、 jsonpatcher は rubygems にあるので gem install jsonpatcher でインストールできます。これにともない、josn-fixman は deprecated となりました。よろしくおねがいします。
どうやって使うのか
こんな感じで使います。
require 'jsonpatcher' # patch array bad_json = '["1","2","3"]' # (elements should be Number) patcher = JSONPatcher.new { array ->(element){ element.to_i } } p patcher.patch(bad_json) #=> [1, 2, 3] # patch object bad_json = '{"name":"shinpei","age":"28"}' # (age should be Number) patcher = JSONPatcher.new { object { property :age, ->(v){ v.to_i } } } p patcher.patch(bad_json) # => '{"name":"shinpei","age":28}' # patch array of objects bad_json = '[{"name":"shinpei","age":"28"},{"name":"kosuge","age":"22"}]' patcher = JSONPatcher.new { array { object { property :age, ->(v){ v.to_i } } } } p patcher.patch(bad_json) # => '[{"name":"shinpei","age":28},{"name":"kosuge","age":22}]' # patch nested object bad_json = '{"following":[{"name":"shinpei","age":"28"},{"name":"kosuge","age":"22"}]}' patcher = JSONPatcher.new { object { property (:following) { array { object { property :age, ->(v){ v.to_i } } } } } } p patcher.patch(bad_json) # => '{"following":[{"name":"shinpei","age":28},{"name":"kosuge","age":22}]}'