我写了一个小脚本来循环我当前的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文件......这不是我想要的:/
答案 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
请注意一些变化: