我有这样的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
示例中的输出包含空格和换行符,这就是报告的行为符合预期的原因.
解决方法:
我先得到密钥,将它们传递给一个读取循环,然后调用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
例如,上述节点将打印每个节点的filename属性.
但是,这可以更简单地表达,jq
仅使用:
jq -r '.images[]|"image --" + .filename' Contents.json
甚至更简单:
jq '"image --\(.images[].filename)"' Contents.json