Выровнять вложенный объект JSON

Я ищу способ, который сгладит "json" хэш в плоский хеш, но храните информацию о пути в плоских ключах. Например:

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

flatten (h) должен вернуть:

{"a" => "foo", "b_0_c" => "bar", "b_0_d_0" => "baz"}
 pguardiario23 мая 2012 г., 09:54
Я не думаю, что "что вы пробовали"? действительно применяется в этой ситуации. Это общий вопрос, который полезно иметь в базе знаний.
 pguardiario23 мая 2012 г., 10:29
Хаха, нет проблем.
 pguardiario23 мая 2012 г., 10:07
Может быть, но если бы я реализовал это сам, его бы здесь не было. Я думал, что ответ должен быть здесь, поэтому я разместил вопрос.
 Sergio Tulentsev23 мая 2012 г., 10:12
О, это ты, ОП. Извини :)

Ответы на вопрос(2)

Решение Вопроса

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

module Enumerable
  def flatten_with_path(parent_prefix = nil)
    res = {}

    self.each_with_index do |elem, i|
      if elem.is_a?(Array)
        k, v = elem
      else
        k, v = i, elem
      end

      key = parent_prefix ? "#{parent_prefix}.#{k}" : k # assign key name for result hash

      if v.is_a? Enumerable
        res.merge!(v.flatten_with_path(key)) # recursive call to flatten child elements
      else
        res[key] = v
      end
    end

    res
  end
end

puts h.flatten_with_path.inspect
 pguardiario23 мая 2012 г., 09:48
Очень хорошее решение.

Лучший способ получить плоский JSON (денормализовать) из иерархического JSON в Ruby с возможным решением

Является ли мое решение оптимальным или есть лучший способ?

Ваш ответ на вопрос