更改和更新JSON文件

时间:2017-05-26 19:43:23

标签: json ruby

我写了一个小脚本来循环我当前的Json文件,但它不能附加一个键和值。

这是我的档案

[
  {
    "URL": "https://p59-caldav.icloud.com",
  }
]

我想附加一个像这样的键和值

[
  {
    "URL": "https://p59-caldav.icloud.com",
    "test": "test"
  }
]

我当前的脚本设置

#!/usr/bin/env ruby

require 'rubygems'
require 'json'
require 'domainatrix'

jsonHash = File.read("/Users/ReffasCode/Desktop/sampleData.json")
array = JSON.parse(jsonHash)

File.open("/Users/BilalReffas/Desktop/sampleData.json","w") do |f|

  array.each do |child|
    url = Domainatrix.parse(child["URL"])
    json = {
      "url" => child["URL"],
      "provider" => url.domain,
      "service" => url.subdomain,
      "context" =>  url.path,
      "suffix" => url.public_suffix
    }

    f.write(JSON.pretty_generate(json))
  end
end

脚本覆盖了我的整个json文件......这不是我想要的:/

2 个答案:

答案 0 :(得分:2)

这是未经测试的,但看起来是正确的:

ORIGINAL_JSON = 'sampleData.json'
NEW_JSON = ORIGINAL_JSON + '.new'
OLD_JSON = ORIGINAL_JSON + '.old'

json = JSON.parse(File.read(ORIGINAL_JSON))

ary = json.map do |child|
  url = Domainatrix.parse(child['URL'])
  {
    'url' => child['URL'],
    'provider' => url.domain,
    'service' => url.subdomain,
    'context' => url.path,
    'suffix' => url.public_suffix
  }
end

File.write(NEW_JSON, ary.to_json)

File.rename(ORIGINAL_JSON, OLD_JSON)
File.rename(NEW_JSON, ORIGINAL_JSON)
File.delete(OLD_JSON)

重要的是不要覆盖原始文件,直到所有处理都发生,因此写入新文件,关闭新旧文件,然后将旧文件重命名为安全文件,将新文件重命名为原始名称,然后能够删除原始。如果您不遵循此类流程,则如果代码或计算机在流中崩溃,则可能会损坏或丢失原始数据。

有关详细信息,请参阅“How to search file text for a pattern and replace it with a given value”。

答案 1 :(得分:1)

使用f.write的最简单方法可能是使用它来替换文件的全部内容。考虑到这一点,让我们看看我们是否可以在内存中编写我们想要的文件的全部内容,然后编写它。

#!/usr/bin/env ruby

require 'rubygems'
require 'json'
require 'domainatrix'

write_array = []
jsonHash = File.read("/Users/ReffasCode/Desktop/sampleData.json")
read_array = JSON.parse(jsonHash)
read_array.each do |child|
    url = Domainatrix.parse(child["URL"])
    write_array << {
        "url" => child["URL"],
        "provider" => url.domain,
        "service" => url.subdomain,
        "context" =>  url.path,
        "suffix" => url.public_suffix
    }
end

File.open("/Users/BilalReffas/Desktop/sampleData.json","w") do |f|
    f.write(JSON.pretty_generate(write_array))
end

请注意一些变化:

  1. 固定缩进:)
  2. 删除了一些嵌套
  3. 使用文件的全部内容编写一次。除非你有一个非常大的文件或对流水线I / O非常重要的需求,否则这可能是最简单的事情。