我知道如何从关联数组创建 JSON,但这不是我的问题。
我有这个关联数组:
declare -A aliases
aliases[Index]=components/Index/Exports
aliases[Shared]=components/Shared/Exports
aliases[Icons]=components/Icons/Exports
现在我需要将这个关联数组转换成这个 JSON:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"Index": ["components/Index/Exports"],
"Shared": ["components/Shared/Exports"],
"Icons": ["components/Icons/Exports"],
}
}
}
我想使用jo
和jq
。但我想不出嵌套。
我试过这段代码:
jo -p compilerOptions[baseUrl]=. compilerOptions[paths]="$(jo -p a ${Aliases[@]})"
但它甚至不运行。
一种可能的解决方案:
不使用
jo
,而是将关联数组的键和值aliases
作为jq
位置参数传递--args
到命令末尾(--args
如果使用的话,必须始终是最后一个选项)。该jq
实用程序将键和值作为单个数组接收,$ARGS.positional
. 这意味着数组的前半部分包含键,数组的后半部分包含相应的值。jq
表达式的主体创建输出对象并使用从零开始reduce
的整数范围内的操作,其中是数组中的元素数。该操作通过逐一添加位置参数来构建对象,使用:th 参数作为键,+ :th 参数作为相应数组值中的元素。$n
$n
aliases
reduce
paths
$i
$i
$n
jo
用于创建关联数组的每个键值对的叶对象的方法略有不同:这将输出三个对象
由于我们是这样使用
jo
的,所以我们对数组的键施加了一些明显的限制(可能不包含=
等[]
)我们可以
jq
像jo
这样使用:然后我们可以阅读这些并将它们添加到我们正在创建的对象中的正确位置
jq
:这里的主要区别是我们不将内容
jq
作为命令行选项传递,而是作为 JSON 对象流传递。就个人而言,我会使用
perl
或其他适当的编程语言而不是 shell(尤其是 bash!)。或者至少切换到zsh
更好的关联数组支持并perl
用来做 JSONy 的东西:或者: