我想要一个可以更新Json内容的方法,如下所示:
data = { "id"=>7913251, "domain"=>"domain.com", "ready"=>true, "create_starttime"=>"2018-08-30 05:57:14 -0500" }
update_json(data, 'profile/zones/0/esxi/1')
在上面的键中,zone和esxi是哈希数组。下面的示例josn内容
{"profile"=>
{"zones"=>
[{"name"=>"cloud_group1",
"is_main"=>true,
"esxi"=>
[{"id"=>7923451,
"domain"=>"domain.com",
"ready"=>true,
"create_starttime"=>"2018-08-30 05:57:14 -0500",
"create_stoptime"=>"2018-08-30 07:29:05 -0500"}]
}]
}
}
当哈希中没有数组时,以下代码有效。
def update_json(data, path)
components = path.split('/')
if components.length > 1
key = components[-1]
path.slice! "/#{key}"
find.tree(path)[key] = data
else
find.tree[path] = data
end
File.open(json_string, 'w') { |file| file.write(JSON.pretty_generate(find.tree)) }
end # update_json
在上面的代码中, find.tree 是我的方法,该方法返回路径内例如'profile / zones'的值,如果没有传递参数,它将返回整个json内容
答案 0 :(得分:0)
我对方法tree()
没有任何了解,但是我将像下面的示例那样处理任务:
hash.dig('profile', 'zones', 0, 'esxi')[0] = data
在处理数组时,您不仅需要拆分path
,而且还必须将索引转换为数字。如果find.tree()
正常工作,
key = Integer(key) if key[/^\d+$/]
find.tree(path)[key] = data
应该做的工作。请注意,如果您的路径包含不是数组索引的数字,则该条件将无效。分配散列时也要当心。您可能要确保正确设置了default_proc:https://stackoverflow.com/a/34621043/1288687
希望您对此有帮助。