Achatar um objeto json aninhado

Eu estou procurando um método que vai achatar um hash "json" em um hash achatado mas manter as informações de caminho nas chaves achatadas. Por exemplo:

h = {"a" => "foo", "b" => [{"c" => "bar", "d" => ["baz"]}]}

flatten (h) deve retornar:

{"a" => "foo", "b_0_c" => "bar", "b_0_d_0" => "baz"}