0

我已经盯着这个看了这么久,我在转圈……

我正在使用 rbvmomi gem,在 Pry 中,当我显示一个对象时,它会通过显示嵌套对象的结构向下递归 - 但 to_json 似乎“深入”到某些对象中,但只是转储其他对象的引用>这是一个例子:

[24] pry(main)> g
=> [GuestNicInfo(
   connected: true,
   deviceConfigId: 4000,
   dynamicProperty: [],
   ipAddress: ["10.102.155.146"],
   ipConfig: NetIpConfigInfo(
     dynamicProperty: [],
     ipAddress: [NetIpConfigInfoIpAddress(
        dynamicProperty: [],
        ipAddress: "10.102.155.146",
        prefixLength: 20,
        state: "preferred"
      )]
   ),
   macAddress: "00:50:56:a0:56:9d",
   network: "F5_Real_VM_IPs"
 )]
[25] pry(main)> g.to_json
=> "[\"#<RbVmomi::VIM::GuestNicInfo:0x000000085ecc68>\"]"

Pry 显然只是使用了一个加强版的 pp,虽然“pp g”让我接近我想要的,但我还是尽可能地转向 json,这样我就不需要自定义解析器来加载和操纵结果。

问题是 - 我怎样才能让 json 模块像 pp 一样深入挖掘?如果答案是“你不能”——还有其他实现目标的建议吗?我没有嫁给 json - 如果我可以将数据序列化并稍后读回(无需编写任何东西来解析 pp 输出......这可能已经存在,我应该寻找它),那么这一切都是胜利。

我的“真正”目标是通过 rbvmomi 从我们的 vsphere 内容中获取大量信息,以便我可以对其进行一些网络/虚拟机分析,这就是为什么我想以一种很好的机器解析格式获取它. 如果我在这里做了一些愚蠢的事情并且有更简单的方法来解决这个问题 - 把它放在我身上,我并不感到骄傲。感谢大家的时间和关注。

更新:根据 Arnie 的回复,我将这个猴子补丁添加到我的脚本中:

class RbVmomi::BasicTypes::DataObject
   def to_json(*args)
      h = self.props
      m = h.merge({ JSON.create_id => self.class.name })
      m.to_json(*args)
   end
end

现在我的 to_json 很好地递归下来。我会看到关于提交这个(或def,真的)到项目。

4

1 回答 1

1

.to_json递归方式工作,默认行为定义为

将此对象转换为字符串(调用 to_s),将其转换为 JSON 字符串,并返回结果。如果没有为某些对象定义特殊方法 to_json,这是一个后备。

json库为一些常用类添加了一些实现(查看本文档的左侧),例如Array, Range, DateTime.

对于数组,to_json首先将所有元素转换为 json 对象,然后 concat 在一起,然后添加数组标记[/ ]

对于您的情况,您需要为 和 定义自定义to_json方法。我不知道你对这三个类的实现,所以我写了一个例子来演示如何实现这一点:GuestNicInfoNetIpConfigInfoNetIpConfigInfoIpAddress

require 'json'

class MyClass
  attr_accessor :a, :b
  def initialize(a, b)
    @a = a
    @b = b
  end
end

data = [MyClass.new(1, "foobar")]
puts data.to_json
#=> ["#<MyClass:0x007fb6626c7260>"]    

class MyClass
  def to_json(*args)
    {
      JSON.create_id => self.class.name,
      :a => a,
      :b => b
    }.to_json(*args)
  end
end

puts data.to_json
#=> [{"json_class":"MyClass","a":1,"b":"foobar"}]
于 2014-06-27T09:32:17.283 回答