読者です 読者をやめる 読者になる 読者になる

jsonpatcher gem をリリースしました

Ruby

なにであってなにでないのか

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}]}'