首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将OpenStruct深转换为JSON

将OpenStruct深转换为JSON
EN

Stack Overflow用户
提问于 2015-10-13 00:05:15
回答 6查看 7.3K关注 0票数 7

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

理想情况是:

代码语言:javascript
复制
x = OpenStruct.new
x.y = OpenStruct.new
x.y.z = OpenStruct.new
z = 'hello'

x.to_json
// {y: z: 'hello'}

现实

代码语言:javascript
复制
{ <OpenStruct= ....> }
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-10-13 00:19:33

没有默认的方法来完成这样的任务,因为内置#to_hash返回哈希表示,但它不会深入转换值。

如果一个值是一个OpenStruct,它就会以这样的方式返回,并且它不会被转换为Hash

然而,这并不是很复杂的解决办法。您可以创建一个方法,该方法遍历OpenStruct实例中的每个键/值(例如使用each_pair),如果该值是OpenStruct,则递归下降到嵌套的OpenStruct中,并返回一个只有Ruby类型的Hash

这样的Hash就可以很容易地使用.to_jsonJSON.dump(hash)序列化。

这是一个非常快速的示例,通过@Yuval对OpenStructs数组的更新:

代码语言:javascript
复制
def openstruct_to_hash(object, hash = {})
  case object
  when OpenStruct then
    object.each_pair do |key, value|
    hash[key] = openstruct_to_hash(value)
    end
    hash
  when Array then
    object.map { |v| openstruct_to_hash(v) }
  else object
  end
end

openstruct_to_hash(OpenStruct.new(foo: 1, bar: OpenStruct.new(baz: 2)))
# => {:foo=>1, :bar=>{:baz=>2}}
票数 12
EN

Stack Overflow用户

发布于 2017-08-17 18:25:44

修正上述解决方案以处理数组

代码语言:javascript
复制
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
票数 9
EN

Stack Overflow用户

发布于 2020-04-29 01:32:47

这里还有另一种方法,它是从lancegatlin的答案修改而来的。还将方法添加到OpenStruct类本身。

代码语言:javascript
复制
class OpenStruct
  def deep_to_h
    each_pair.map do |key, value|
      [
        key,
        case value
          when OpenStruct then value.deep_to_h
          when Array then value.map {|el| el === OpenStruct ? el.deep_to_h : el}
          else value
        end
      ]
    end.to_h
  end
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33092107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档