将OpenStruct深度转换为JSON

我有一个与许多其他OpenStructs嵌套的OpenStructs 。 什么是将它们全部转换为JSON的最佳方法?

理想的情况是:

 x = OpenStruct.new xy = OpenStruct.new xyz = OpenStruct.new z = 'hello' x.to_json // {y: z: 'hello'} 

现实

 {  } 

没有默认方法可以完成此类任务,因为内置的#to_hash返回哈希表示,但它不会深度转换值。

如果某个值是OpenStruct ,则它将返回,并且不会转换为Hash

但是,要解决这个问题并不复杂。 您可以创建一个遍历OpenStruct实例中每个键/值的OpenStruct (例如,使用each_pair ),如果值是OpenStructOpenStruct递归方式下降到嵌套的OpenStruct并返回一个只有Ruby基本类型的Hash

然后可以使用.to_jsonJSON.dump(hash)轻松地序列化这样的Hash

这是一个非常快速的例子

 def openstruct_to_hash(object, hash = {}) object.each_pair do |key, value| hash[key] = value.is_a?(OpenStruct) ? openstruct_to_hash(value) : value end hash end openstruct_to_hash(OpenStruct.new(foo: 1, bar: OpenStruct.new(baz: 2))) # => {:foo=>1, :bar=>{:baz=>2}} 

修复了以上解决方案来处理数组

 def open_struct_to_hash(object, hash = {}) object.each_pair do |key, value| hash[key] = case value when OpenStruct then open_struct_to_hash(value) when Array then value.map { |v| open_struct_to_hash(v) } else value end end hash end