首页 > 解决方案 > 基于命名空间嵌套和合并 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": {}}}}

成员必须嵌套在其对应的命名空间对象下,唯一的期望是根"/"命名空间的成员成为顶级属性。

我已经为这个问题挠了几次头,因为我想一次性完成(理想情况下),但我愿意接受任何其他建议。

标签: jsonpathjqhierarchical-data

解决方案


getpath将命名空间转换为路径,您可以使用/ setpathbuilt-ins构建所需的输出。

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

在线演示


推荐阅读