json - 基于命名空间嵌套和合并 JSON
问题描述
我有以下 JSON 文档:(
按命名空间排序;任何命名空间都可以出现多次)
[ {"namespace": "/" , "exports": {"a": 10, "b": 11}}
, {"namespace": "/" , "exports": {"c": 12, "d": 13}}
, {"namespace": "/bar" , "exports": {"e": 14, "f": 15}}
, {"namespace": "/bar/baz", "exports": {"g": 16, "h": 17}}
]
我需要转换成这个 JSON 文档:(
键冲突的风险可以忽略)
{ "a": 10
, "b": 11
, "c": 12
, "d": 13
, "bar": { "e": 14
, "f": 15
, "baz": { "g": 16
, "h": 17}}}
请注意,在嵌套命名空间时,我们只保留它们的基本名称,例如,
/
/bar
/bar/baz
/bar/baz/bat
变成:
{"bar": {"baz": {"bat": {}}}}
成员必须嵌套在其对应的命名空间对象下,唯一的期望是根"/"
命名空间的成员成为顶级属性。
我已经为这个问题挠了几次头,因为我想一次性完成(理想情况下),但我愿意接受任何其他建议。
解决方案
getpath
将命名空间转换为路径,您可以使用/ setpath
built-ins构建所需的输出。
reduce .[] as {$namespace, $exports} ({};
($namespace | ltrimstr("/") | split("/")) as $path
| setpath($path; getpath($path) + $exports)
)
推荐阅读
- python - 提取 Yelp 评分评论
- java - 单击生成器上的 Slack Java 禁用按钮
- vuejs3 - 如何在 vuejs 中制作动态表单
- sparql - 如何使用 SPARQL 和 DBPedia 获取有关人员或其他实体的所有可用信息
- linux - 如何在 goDevBox [alpha] 中更新 VSCode
- c# - 转换成 Linq 查询
- python - 在 Discord.py 上使用 MongoDB 执行计划任务
- firebase - 如何在特定时间戳上发送推送通知?
- flutter - integration_test 包可以和 webview 交互吗?
- windows-installer - InstallShield:回滚期间未调用自定义操作