如何使用JSON进行Ruby对象序列化

Jus*_*cle 7 ruby serialization json

我有一个像这样的简单容器类的结构(在伪ruby中):

class A
  attr_reader :string_field1, :string_field2
  ...
end

class B
  attr_reader: int_field3, :string_field4
  ...
end

# C includes an instance of A and B
class C
  attr_reader: :a_instance, :b_instance
  ...
end
Run Code Online (Sandbox Code Playgroud)

是否有简单的方法在Ruby中将其/序列化为JSON?或者我应该像每个类一样制作嵌套的序列化方法,如本例所示

编辑:

在我的特定场景中,我想将一些JSON数据发送到运行Ruby的服务器,这将提取数据并采取相应的行动.

JSON的发送者不一定是Ruby进程,但可能是其他系统的后端.(虽然在我的测试工具中是Ruby).

因此,我不需要JSON采用某种"特定于Ruby"的格式,我只是假设如果它实际上是内置于Ruby的话会更容易.

Dig*_*oss 6

使用Marshal,PStore或其他Ruby解决方案来处理非JSON对象

人们可能有理由怀疑为什么像Ruby这样的完全反射的语言不会自动化JSON生成和任意类的解析.

但是,除非您坚持使用JSON类型,否则除了运行另一个Ruby之外,没有地方可以发送或接收JSON对象.在这种情况下,我怀疑传统的智慧是"忘记JSON,使用像核心类一样的原生Ruby接口Marshal.

因此,如果您真的将这些对象发送到PHP或非Ruby的东西,那么您应该使用Array等直接创建支持JSON的Ruby数据结构,然后您将拥有JSON.generate将直接处理的内容.

如果你只是需要序列化,你应该使用MarshalPStore.

更新:啊哈,好的,试试这个:

module AutoJ
  def auto_j
    h = {}
    instance_variables.each do |e|
      o = instance_variable_get e.to_sym
      h[e[1..-1]] = (o.respond_to? :auto_j) ? o.auto_j : o;
    end
    h
  end
  def to_json *a
    auto_j.to_json *a
  end
end
Run Code Online (Sandbox Code Playgroud)

如果你include AutoJ在每个课程中,那么它应该是DTRT.在您的示例中,这会导致

{"a":{"string_field1":"aa","string_field2":"bb"},"b":{"int_field3":123,"string_field4":"dd"}}
Run Code Online (Sandbox Code Playgroud)

您可能希望将auto_j方法更改h.values为仅返回h,在这种情况下,您将获得:

[["aa","bb"],[123,"dd"]]
Run Code Online (Sandbox Code Playgroud)