【问题标题】:Flatten a nested json object展平嵌套的 json 对象
【发布时间】:2012-05-29 13:44:31
【问题描述】:

我正在寻找一种将“json”散列平展为平展散列但将路径信息保留在平展键中的方法。 例如:

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

flatten(h) 应该返回:

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

【问题讨论】:

  • 我不认为“你试过什么”真的适用于这种情况。这是一个普遍的问题,在知识库中很有用。
  • 也许可以,但如果我自己实现它就不会在这里。我认为答案应该在这里,所以我发布了这个问题。
  • 哦,是你,OP。对不起:)

标签: ruby arrays json hash


【解决方案1】:

这应该可以解决您的问题:

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

【讨论】:

    【解决方案2】:

    我有一个类似的问题并在这里提出 Best way to produce a flattened JSON (denormalize) out of hierarchical JSON in Ruby 有一个可能的解决方案

    我的解决方案是最优方案还是有更好的方法?

    【讨论】:

      猜你喜欢
      • 2021-10-19
      • 2020-03-02
      • 1970-01-01
      • 2019-01-17
      • 2019-01-26
      • 2020-01-21
      • 1970-01-01
      • 2018-10-24
      相关资源
      最近更新 更多