json - 基于命名空间嵌套和合并 JSON

标签 json path jq hierarchical-data

我有以下 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 内置函数构建所需的输出。

reduce .[] as {$namespace, $exports} ({};
  ($namespace | ltrimstr("/") | split("/")) as $path
  | setpath($path; getpath($path) + $exports)
)

Online demo

关于json - 基于命名空间嵌套和合并 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65978589/

相关文章:

c# - 如何在解决方案C#中获取另一个项目的绝对路径

java - "/"的 Restful 路径用法

node.js - Node.js 中的路径令人困惑

json - 如何循环来自bash脚本的json键结果

aws-cloudformation - 如何在具有标签和特殊字符值的对象的字段上选择包含?

json - 使用 jq 根据另一个数组中的字符串编辑 json 数组中的对象

php - 将 JSON 中的值插入数据库

c# - 如果元素名称以句点结尾,则发生 BsonSerializationException

ios - json解析崩溃

javascript - Jquery 多个提交按钮