![](/img/trans.png)
[英]Get Specific JSON Object by ID from array and return the JSON object (Javascript/JQuery)
[英]return specific items in json object using bash
我试图对多个对象进行json响应(来自curl命令和安装在我的linux comp上的jq),并使用for循环编辑每个对象。 问题是我不明白如何将每个{}转换为单独的对象。 例如,我的json响应是:
{
"Name": "testuser1",
"Username": "testuser1",
"Url": "www.test1.com"
}
{
"Name": "testuser2",
"Username": "testuser2",
"Url": "www.test2.com"
}
理想情况下,我想用数字来指代每个人。 例如,“ echo $ item | jq'.Name [0]'”
{
"Name": "testuser1",
"Username": "testuser1",
"Url": "www.test1.com"
}
当我运行上面的命令时,出现以下错误。
jq: error (at <stdin>:1): Cannot index string with number
我想为每个对象运行一个forloop。
您需要做两件事:一,使用-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)
jq是面向流的,因此,如果要对每个对象执行某些操作,则在jq中定义该操作可能就足够了,让jq毫不费力地处理流。
如果由于某种原因您需要流中每个项目的索引,那么如果jq有inputs
(与jq 1.5一样),则可以避免使用-s
选项。 (避免使用-s
选项可以节省内存。)
以下假设您的jq确实有inputs
; 索引是从0开始的; 并使用-n选项调用该jq。
foreach inputs as $input (-1; .+1; [., $input])
这将产生[INDEX,ITEM]数组流。 然后,您可以使用jq的管道运算符( |
)进一步添加jq过滤器。
为了说明调用jq的合适方法,让我们假设JSON实体流来自curl COMMAND
,并且我们想要第二项(即索引为1)。
curl COMMAND | jq --argjson i 1 -n -f program.jq
(请注意-n
命令行选项!)
def get($i):
label $done
| foreach inputs as $input (-1; .+1;
if $i == . then $input, break $done else empty end);
get($i)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.