Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 在数组中循环时出现jq错误:无法使用字符串“为数组编制索引”&书信电报;键>&引用;_Json_Linux_Bash_Shell_Jq - Fatal编程技术网

Json 在数组中循环时出现jq错误:无法使用字符串“为数组编制索引”&书信电报;键>&引用;

Json 在数组中循环时出现jq错误:无法使用字符串“为数组编制索引”&书信电报;键>&引用;,json,linux,bash,shell,jq,Json,Linux,Bash,Shell,Jq,我正在尝试迭代all索引中包含的所有元素。这是我的json字符串: { "all":[ { "id":"51a" }, { "id":"52b" }, { "id":"53c" } ] } 我曾尝试使用jq进行迭代: for id in $(jq '.all.id | keys | .[]' <<<

我正在尝试迭代
all
索引中包含的所有元素。这是我的json字符串:

{  
   "all":[  
      {  
            "id":"51a"
      },
      {  
            "id":"52b"
      },
      {  
            "id":"53c"
      }
    ]
}
我曾尝试使用
jq
进行迭代:

for id in $(jq '.all.id | keys | .[]' <<< "$json"); do
    echo "$id"
done
就像这样:

for id in $(jq -r '.all[].id' <<< "$json"); do
    echo "$id"
done
整个脚本可能如下所示:

#!/usr/bin/env bash

json='{  
   "all":[  
      {  
            "id":"51a"
      },
      {  
            "id":"52b"
      },
      {  
            "id":"53c"
      }
    ]
}'

for id in $(jq -r '.all[].id' <<< "$json"); do
    echo "$id"
done

这里有一个基于用于JSON的步行路径unix工具的替代解决方案:

bash $ for id in $(jtc -qq -w'[all][:][id]' <<< "$json"); do  echo "$id"; done
51a
52b
53c
bash $ 

bash$表示$中的id(jtc-qq-w'[all][:][id]“谢谢你的回答!我找到了一个解决方法,但我将使用回答中的代码。我想知道是否可以从同一数组中提取其他元素。假设我有id和名称索引及其值。如何提取两者?@executable:
jq
是一个相当简单的工具。它定义了额外的表达式。”ct输入的一部分,以及用于组合输出的语法。
.all[].id
.all.[].id
的简写形式,您需要在
.id
之外添加另一个成员。那么第二个成员应该如何与
.id
组合?@可执行文件:它可以是这样的:
表示$(jq-r.)中的id。all[].id+“”+.name'@Arkadiusz Drabczyk感谢您的回答,但是可以将它们分别分配给变量吗?与
jq
有什么不同?工具截然不同。jq是一个拥有自己的DSL的处理器,其操作范围远远超出JSON数据模型。而jtc是一个仅限于数据模型操作的实用程序。这与erence让处理源JSON的查询变得容易多了(但当然是mho)。
而IFS=read-rid;do…;done<
#!/usr/bin/env bash

json='{  
   "all":[  
      {  
            "id":"51a"
      },
      {  
            "id":"52b"
      },
      {  
            "id":"53c"
      }
    ]
}'

for id in $(jq -r '.all[].id' <<< "$json"); do
    echo "$id"
done
#!/usr/bin/env bash

json='{
   "all":[
      {
            "id":"51a",
            "name":"Steve"
      },
      {
            "id":"52b",
            "name":"Phoebe"
      },
      {
            "id":"53c",
            "name":"Dino"
      }
    ]
}'

jq -r '.all[] | .id + " " + .name' <<< "$json" |
    while read -r id name; do
        echo id: "$id"
        echo name: "$name"
    done
bash $ for id in $(jtc -qq -w'[all][:][id]' <<< "$json"); do  echo "$id"; done
51a
52b
53c
bash $