gpt4 book ai didi

json - 遍历字典 jq - shell

转载 作者:行者123 更新时间:2023-12-04 16:30:06 24 4
gpt4 key购买 nike

我有一个这样的 JSON

{
"images" : [
{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-Small@2x.png",
"scale" : "2x"
}
......
......
{
"size" : "60x60",
"idiom" : "iphone",
"filename" : "Icon-60@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}

我想遍历 images 中的每个字典大批。
为此我写了
declare -a images=($(cat Contents.json | jq ".images[]"))
for image in "${images[@]}"
do
echo "image --$image"
done

我期待每个字典在迭代中打印的输出。那是
image --{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-Small@2x.png",
"scale" : "2x"
}
image --{
"size" : "29x29",
"idiom" : "iphone",
"filename" : "Icon-Small@3x.png",
"scale" : "3x"
}
image --{
"size" : "40x40",
"idiom" : "iphone",
"filename" : "Icon-Spotlight-40@2x.png",
"scale" : "2x"
}

等等

但是它遍历每个字典中的每个元素,例如
image --{
image --"size":
image --"29x29",
image --"idiom":
image --"iphone",
image --"filename":
....
....
....

我的代码有什么问题

最佳答案

您的代码的问题在于 bash 中的数组初始化如下所示:

declare -a arr=(item1 item2 item3)

项目由空格或换行符分隔。您还可以使用:
declare -a arr(
item1
item2
item3
)

然而, jq示例中的输出同时包含空格和换行符,这就是报告的行为符合预期的原因。

解决方法:

我会先获取 key ,将它们通过管道传输到读取循环,然后调用 jq对于列表中的每个项目:

jq -r '.images|keys[]' Contents.json | while read key ; do
echo "image --$(jq ".images[$key]" Contents.json)"
done

您也可以使用此 jq如果您不关心 pretty-print ,请执行以下命令:
jq -r '.images[]|"image --" + tostring' Contents.json

要访问子数组的某个属性,您可以使用:
jq -r '.images|keys[]' Contents.json | while read key ; do
echo "image --$(jq ".images[$key].filename" Contents.json)"
done

例如,上面的节点将打印每个节点的文件名属性。

然而,使用 jq 可以更简单地表达这一点。只要:
jq -r '.images[]|"image --" + .filename' Contents.json

或者更简单:
jq '"image --\(.images[].filename)"' Contents.json

关于json - 遍历字典 jq - shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34529156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com