json - 使用路径更新 Json 的函数(例如:profile/zones/objects/object)
问题描述
我想要一个方法来更新 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')
在上面的键区和 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 内容
解决方案
我看不到方法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
我希望你觉得这有帮助。
推荐阅读
- amazon-web-services - JavaScript 中的 AWS 身份验证
- javascript - mindate 和 maxdate 在 datepicker 中不起作用(内联方法)
- morris.js - 莫里斯折线图空
- javascript - Angular - 在路由设置中使用路由参数
- php - php算法将一组数据分成不超过四个的组
- angular - 如何在 Angular 中重用模板 HTML 块?
- import - 无法在 Neo4j 中导入脚本
- python - 将字典python中的元素移动到另一个索引
- angular - Angular 5 Material mat select:根据选择的值过滤,
- postgresql - Npgsql.PostgresException (0x80004005): XX000: 模式删除时类型 207852 的缓存查找失败