Flatten a nested json object

后端 未结 2 746
清歌不尽
清歌不尽 2020-12-29 15:28

I\'m looking for a method that will flatten a \"json\" hash into a flattened hash but keep the path information in the flattened keys. For example:

h = {\"a\         


        
相关标签:
2条回答
  • 2020-12-29 16:07

    This should solve your problem:

    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
    
    0 讨论(0)
  • 2020-12-29 16:29

    I'm having a similar question and raised it here Best way to produce a flattened JSON (denormalize) out of hierarchical JSON in Ruby with a possible solution

    Is my solution an optimal one or is there any better way?

    0 讨论(0)
提交回复
热议问题