首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用bash返回json对象中的特定项

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

Stack Overflow用户
提问于 2018-06-02 03:28:07
回答 2查看 997关注 0票数 0

我尝试使用多个对象获取json响应(来自安装在我的linux组件上的curl命令和jq ),并使用for循环编辑每个对象。问题是我不知道如何将每个{}转换成单独的对象。例如,我的json响应是:

代码语言:javascript
复制
{
  "Name": "testuser1",
  "Username": "testuser1",
  "Url": "www.test1.com"
}
{
  "Name": "testuser2",
  "Username": "testuser2",
  "Url": "www.test2.com"
}

理想情况下,我希望通过一个数字来引用每一个。例如,"echo $item | jq '.Name'“表示

代码语言:javascript
复制
{
  "Name": "testuser1",
  "Username": "testuser1",
  "Url": "www.test1.com"
}

当我运行上面的命令时,我得到以下错误。

代码语言:javascript
复制
jq: error (at <stdin>:1): Cannot index string with number

我想为每个对象运行一个forloop。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-02 03:49:20

您需要做两件事:首先,使用-s选项,使每个单独的对象成为单个数组的一个元素。其次,您正在尝试索引Name,而不是访问数组元素的Name属性。

代码语言:javascript
复制
$ jq -sr '.[].Name' tmp.json
testuser1
testuser2

如果您想引用流的特定元素,您可以:

代码语言:javascript
复制
$ jq -sr '.[1].Name' tmp.json
testuser2

这样(假设您的名字都不包含换行符),一个适当的循环将如下所示

代码语言:javascript
复制
while IFS= read -r name; do
    ...
done < <(jq -sr '.[].Name' tmp.json)
票数 2
EN

Stack Overflow用户

发布于 2018-06-02 17:36:39

jq是面向流的,所以如果您想在每个对象上执行某些操作,那么在jq中定义该操作并让jq处理流就足够了。

如果出于某种原因,您需要流中每个项目的索引,那么如果您的jq具有inputs,则可以避免使用-s选项(JQ1.5也是如此)。(避免使用-s选项可节省内存。)

下面假设您的jq具有inputs;索引是从0开始的;并且jq是使用-n选项调用的。

生成索引

代码语言:javascript
复制
foreach inputs as $input (-1; .+1; [., $input])

这将产生一个索引,项目数组的流。然后,您可以使用jq的管道操作符(|)添加更多的jq过滤器。

从JSON实体流中选择第i个项目。

为了说明调用jq的合适方法,让我们假设JSON实体流来自curl COMMAND,并且我们需要第二项(即,索引为1)。

调用

代码语言:javascript
复制
curl COMMAND | jq --argjson i 1 -n -f program.jq

(请注意-n命令行选项!)

program.jq

代码语言:javascript
复制
def get($i):
  label $done
  | foreach inputs as $input (-1; .+1;
      if $i == . then $input, break $done else empty end);

get($i)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50649937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档