gpt4 book ai didi

ruby-on-rails - 如何将递归/嵌套的 OpenStruct 对象转换为哈希

转载 作者:数据小太阳 更新时间:2023-10-29 07:54:48 24 4
gpt4 key购买 nike

我有一个 OpenStruct 对象,需要转换为 JSON 数据。

示例哈希(来自 RSPEC 助手):

def test_order
{
"id": 505311428702,
"email": "test@gmail.com",
"closed_at": "",
"discount_codes": {
"id": 507328175,
"text": "test"
}
}
end

我正在使用下面的递归函数:

def to_recursive_ostruct(hash)
OpenStruct.new(hash.each_with_object({}) do |(key, val), memo|
memo[key] = val.is_a?(Hash) ? to_recursive_ostruct(val) : val
end)
end

对于 ex to_recursive_ostruct(test_order),将返回:

<OpenStruct id=505311428702, email="test@gmail.com", closed_at="", ...>

转换后,使用 OpenStructObject.marshal_dump:

{
:id=>505311428702, :email=>"test@gmail.com", :closed_at=>"",

discount_codes=>#<OpenStruct id=507328175, text= "test">}
}

OpenStructObject.marshal_dump 在第一层给我正确的数据,

我还想转换嵌套数据。

我真正需要的是这样的:

{:id=>505311428702, :email=>"test@gmail.com", :closed_at=>"", :discount_codes=>{:id=>507328175, :text=> "test"} }

请帮助,在此先感谢。

最佳答案

在@Andrey-Deineko、@owyongsk、@aldrien.h 完成的工作的基础上,这是一个处理数组的转换器。虽然 OP 并没有特别关注这一点,但其他人可能会发现它有帮助。


def openstruct_to_h(object)
object.to_h.transform_values do |value|
value.is_a?(OpenStruct) ? openstruct_to_h(value) : value.is_a?(Array) ? value.map{|v| v.is_a?(String) ? v : openstruct_to_h(v) } : value
end
end

# Example usage

open_struct_object = OpenStruct.new(paramtest: "ok", array_test: [OpenStruct.new(array_one: true), OpenStruct.new(array_two: false, nested_os: OpenStruct.new(works: 'maybe'))], os_test: OpenStruct.new(testy: "yup"))

openstruct_to_h(open_struct_object)

=> {:paramtest=>"ok", :array_test=>[{:array_one=>true}, {:array_two=>false, :nested_os=>{:works=>"maybe"}}], :os_test=>{:testy=>"yup"}}

关于ruby-on-rails - 如何将递归/嵌套的 OpenStruct 对象转换为哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51961012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com