我尝试使用多个对象获取json响应(来自安装在我的linux组件上的curl命令和jq ),并使用for循环编辑每个对象。问题是我不知道如何将每个{}转换成单独的对象。例如,我的json响应是:
{
"Name": "testuser1",
"Username": "testuser1",
"Url": "www.test1.com"
}
{
"Name": "testuser2",
"Username": "testuser2",
"Url": "www.test2.com"
}
理想情况下,我希望通过一个数字来引用每一个。例如,"echo $item | jq '.Name'“表示
{
"Name": "testuser1",
"Username": "testuser1",
"Url": "www.test1.com"
}
当我运行上面的命令时,我得到以下错误。
jq: error (at <stdin>:1): Cannot index string with number
我想为每个对象运行一个forloop。
发布于 2018-06-02 03:49:20
您需要做两件事:首先,使用-s
选项,使每个单独的对象成为单个数组的一个元素。其次,您正在尝试索引Name
,而不是访问数组元素的Name
属性。
$ jq -sr '.[].Name' tmp.json
testuser1
testuser2
如果您想引用流的特定元素,您可以:
$ jq -sr '.[1].Name' tmp.json
testuser2
这样(假设您的名字都不包含换行符),一个适当的循环将如下所示
while IFS= read -r name; do
...
done < <(jq -sr '.[].Name' tmp.json)
发布于 2018-06-02 17:36:39
jq是面向流的,所以如果您想在每个对象上执行某些操作,那么在jq中定义该操作并让jq处理流就足够了。
如果出于某种原因,您需要流中每个项目的索引,那么如果您的jq具有inputs
,则可以避免使用-s
选项(JQ1.5也是如此)。(避免使用-s
选项可节省内存。)
下面假设您的jq具有inputs
;索引是从0开始的;并且jq是使用-n选项调用的。
生成索引
foreach inputs as $input (-1; .+1; [., $input])
这将产生一个索引,项目数组的流。然后,您可以使用jq的管道操作符(|
)添加更多的jq过滤器。
从JSON实体流中选择第i个项目。
为了说明调用jq的合适方法,让我们假设JSON实体流来自curl COMMAND
,并且我们需要第二项(即,索引为1)。
调用
curl COMMAND | jq --argjson i 1 -n -f program.jq
(请注意-n
命令行选项!)
program.jq
def get($i):
label $done
| foreach inputs as $input (-1; .+1;
if $i == . then $input, break $done else empty end);
get($i)
https://stackoverflow.com/questions/50649937
复制相似问题