【问题标题】:How to save data into JSON with Ruby and use it later?如何使用 Ruby 将数据保存到 JSON 中并在以后使用?
【发布时间】: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

有什么想法吗?

【问题讨论】:

    标签: json ruby


    【解决方案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 值。

    【讨论】:

    • 谢谢,这很有帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多