将Ruby对象序列化为JSON并返回?

sir*_*cco 4 ruby serialization json

我想将一个对象序列化为JSON,将其写入文件并将其读回.现在我希望在.net中你有json.net之类的东西,你可以这样做:

JsonSerializer.Serialize(obj);
Run Code Online (Sandbox Code Playgroud)

并完成它.你得到了JSON字符串.

我如何在Ruby中执行此操作?没有Rails,没有ActiveRecord,没有任何东西.有没有找不到的宝石?

我安装了JSON gem并调用:

puts JSON.generate([obj])
Run Code Online (Sandbox Code Playgroud)

其中obj是一个像这样的对象:

class CrawlStep

  attr_accessor :id, :name, :next_step

  def initialize (id, name, next_step)
    @id = id
    @name = name
    @next_step = next_step
  end
end

obj = CrawlStep.new(1, 'step 1', CrawlStep.new(2, 'step 2', nil))
Run Code Online (Sandbox Code Playgroud)

我得到的全部是:

["#<CrawlStep:0x00000001270d70>"]
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

sar*_*dne 14

最简单的方法是制作to_json方法和json_create方法.在您的情况下,您可以这样做:

class CrawlStep
  # Insert your code here (attr_accessor and initialize)

  def self.json_create(o)
    new(*o['data'])
  end

  def to_json(*a)
    { 'json_class' => self.class.name, 'data' => [id, name, next_step] }.to_json(*a)
  end
end
Run Code Online (Sandbox Code Playgroud)

然后通过调用JSON.dump(obj)和反序列化来序列化JSON.parse(obj).散列的数据部分to_json可以是任何东西,但我喜欢将它保留到new/ initialize将获得的参数.如果还有其他需要保存的东西,你应该把它放在这里,并以某种方式将其解析并设置json_create.

  • 这对我来说不起作用,直到我查看json gem源,并发现你必须传递一个选项哈希,并将`create_additions`设置为`true`.例如`JSON.parse(obj,create_additions:true)`或`JSON.load(str,nil,create_additions:true)`.否则默认设置为false.这至少是版本1.5.5的情况 (3认同)