繁体   English   中英

使用bash返回json对象中的特定项目

[英]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)

要仅选择名字,您需要尝试进入Name元素之前进行索引:

jq -rs '.[0].Name'

相比之下,对于循环而言, @ chepner的答案给出while read方法确实是合适的。

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过滤器。

从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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM