基于命名空间嵌套合并 JSON
Nest and merge JSON based on namespaces
我有以下 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)
)
我有以下 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)
)