将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
),如果值是OpenStruct
, OpenStruct
递归方式下降到嵌套的OpenStruct
并返回一个只有Ruby基本类型的Hash
。
然后可以使用.to_json
或JSON.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