如何使用 Ruby 将数据保存到 JSON 中并在以后使用?

Posted

技术标签:

【中文标题】如何使用 Ruby 将数据保存到 JSON 中并在以后使用?【英文标题】:How to save data into JSON with Ruby and use it later? 【发布时间】:2022-01-23 18:34:46 【问题描述】:

我正在构建一个简单的“学校图书馆”应用程序以在终端中运行,并将我的大部分文件构建为类。现在我想存储收到的数据,如书名、作者、教师姓名等,我想将其存储在 JSON 文件中。 当我想使用 Ruby 编写文件时,问题就出现了,我执行 File.write("path_to_my_file", data) 并且它正在写入 JSON 文件,但它没有写入我想要的内容。 而不是写

[
  "Title": "My title",
  "Author": "My author"
]

或类似的东西,我得到了

["#<ActualBook:0x00000237dbce9ec8>, #<ActualBook:0x00000237dbdg3r8>"]

其中“ActualBook”是我创建新书的班级名称。 我不知道如何实现这一点。 我试过这段代码但没有运气:


class Storing
  def initialize(arr)
    @books = arr
  end

  def stores_data
    data = []
    @books.each do |book|
      data.push([book.title, book.author])
    end
    send = JSON.dump(data)
    if !File.exist?("./data/books.json")
      File.new("./data/books.json", "w+")
    end
    File.write("./data/books.json", data)
  end
end

有什么想法吗?

【问题讨论】:

【参考方案1】:

您需要先序列化为 JSON

您当前正在将本机 Ruby 对象写入文件,而不是 JSON。要将对象序列化为 JSON,您需要在需要 JSON module 之后对其调用 #to_json 之类的方法。

例如,使用 Ruby 3.0.3:

require 'json'

books = ["Title"=>"My title", "Author"=>"My author"]
File.open("books.json", "w")  |f| f.puts books.to_json 

会将["Title":"My title","Author":"My author"] 的预期 JSON 对象写入您的文件,然后自行关闭。

如果您愿意,您可以验证这在 Ruby 中是否有效,或者在命令行中使用 jq。作为命令行示例:

jq . books.json 
[
  
    "Title": "My title",
    "Author": "My author"
  
]

当然还有其他方法可以生成各种格式的 JSON 对象以进行序列化,但这是您的代码中缺少的部分。在将 Ruby 对象写入文件之前,您必须将它们转换为 JSON 对象,或者(在您的情况下)您最终只需要编写对象的隐式 #to_str 值。

【讨论】:

谢谢,这很有帮助!

以上是关于如何使用 Ruby 将数据保存到 JSON 中并在以后使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何能够将数据保存在列表中并在 recyclerview 中显示

如何让 vbscript 将变量保存到文本文件中并在重新打开程序时调用它们?

将信息保存到文件中并在启动时加载?

如何将图像保存在数据库中并从数据库上传到服务器? [关闭]

如何将任意 Ruby 对象保存到磁盘并在必要时将其读回? [关闭]

Swift:写入 JSON 并在本地保存到 iPhone 文件