遍历字典 jq - shell
Iterate through dictionaries jq - shell
我有一个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)
项目由 space 或换行符分隔。您还可以使用:
declare -a arr(
item1
item2
item3
)
但是,示例中的 jq
输出同时包含 space 和换行符,这就是报告的行为符合预期的原因。
解决方法:
我会先获取密钥,将它们通过管道传输到读取循环,然后为列表中的每个项目调用 jq
:
jq -r '.images|keys[]' Contents.json | while read key ; do
echo "image --$(jq ".images[$key]" Contents.json)"
done
如果您不关心漂亮的打印,您也可以使用此 jq
命令:
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这样的
{
"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)
项目由 space 或换行符分隔。您还可以使用:
declare -a arr(
item1
item2
item3
)
但是,示例中的 jq
输出同时包含 space 和换行符,这就是报告的行为符合预期的原因。
解决方法:
我会先获取密钥,将它们通过管道传输到读取循环,然后为列表中的每个项目调用 jq
:
jq -r '.images|keys[]' Contents.json | while read key ; do
echo "image --$(jq ".images[$key]" Contents.json)"
done
如果您不关心漂亮的打印,您也可以使用此 jq
命令:
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