如何在Ruby中向现有JSON对象添加新的键/值对

时间:2015-04-14 18:55:01

标签: ruby json

如何在Ruby中为现有的JSON对象添加新的键/值对?

我的输出是

{
    "2d967df3-ee07-4e40-8f65-7bbff59bbb7e": {
        "name": "Book1",
        "author": "Author1"
    }
}

当我添加新的键/值对

时,我希望实现类似的功能
{
    "2d967df3-ee07-4e40-8f65-7bbff59bbb7e": {
        "name": "Book1",
        "author": "Author1"
    },
    "c55a3632-9bed-4a41-ae40-c1abfe0f332a": {
        "name": "Book2",
        "author": "Author2"
    }
}

写入JSON文件的方法

def create_book(name, author)
    tempHash = {
        SecureRandom.uuid => {
            "name" => name,
            "author" => author
            }
    }

    File.open("./books/book.json","w") do |f|
      f.write(JSON.pretty_generate(tempHash))
    end
end

2 个答案:

答案 0 :(得分:1)

  

如何将新的键/值对附加到ruby中的现有JSON对象?

如果要将其添加到现有文件,则应首先读取Json,从中提取数据,向数组添加新哈希。也许这样的事情可以解决你的问题:

def create_book(name, author)
  tempHash = {
  SecureRandom.uuid => {
    "name" => name,
    "author" => author
    }
  }

  data_from_json = JSON[File.read("./books/book.json")]
  data_from_json = [data_from_json] if data_from_json.class != Array
  File.open("./books/book.json","w") do |f|
    f.write(JSON.pretty_generate(data_from_json << tempHash))
  end
end

还有其他一些方法,比如将Json作为常用字符串进行操作,但为了安全起见,您应该提取数据,然后创建一个新的Json。

答案 1 :(得分:-1)

如果您需要新的键/值对与以前的数据位于同一JSON元素中,而不是将散列铲除(<<),则将它们合并。

此外,通过翻转您首先合并的哈希,这可以使您将新的键/值对放在元素的开头或结尾。

因此,请从15年4月14日开始使用Maxim的解决方案,但要进行修改以将两个散列合并在一起。

  data_from_json = JSON[http://File.read("./books/book.json")]
  File.open("./books/book.json","w") do |f|
    f.write(JSON.pretty_generate([data_from_json.merge(tempHash)])
  end